1.安装docker
1.安装需要的安装包
yum install -y yum-utils
2.设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装docker
shell
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4.启动docker
docker version #查看版本
systemctl start docker
5.测试hello-world
docker run hello-world
阿里云镜像加速
2.基本命令
整个流程:
为什么docker更快?
帮助命令
docker version #显示docker版本信息
docker info #显示daocker的系统信息
docker 命令 --help #帮助命令
镜像命令
1.docker images
:-a 列出所有的镜像
:-f
:-q 只显示镜像的id
2.docker search mysql
:--filters=STARS=300 #搜索大于3000的
3.docker pull 镜像名[tags]
:不加tag下载最新版
4.docker rmi -f id 删除指定镜像
:docker rmi -f $(docker images -aq) 删除全部镜像
分层下载,若有更新,只需要更新需要更新的几层就行;
容器命令
docker run [可选参数] image
--name="Name" 容器名称
-d 后台方式运行
-it 使用交互式运行
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
docker ps
:列出当前正在运行的容器
:-a 正在运行的容器+带出历史运行过的容器
:-n=? 显示最近创建的容器
:-q 只显示容器的编号
exit 直接退出容器
ctrl +p+q 容器不停止退出
docker rm 容器id (不能删除正在运行的容器)
:docker rm -f $(docker ps -aq)
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
常用的其他命令
后台启动容器
docker run -d centos #后台启动
但是docker ps发现没有进程
因为没有前台进程,docker就停止了
查看容器中的进程信息
docker run -d centos /bin/bash -c "while true;do echo studydocker;sleep 1;done"
查看:
docker logs -tf --tail 10 a6d2fae9c98c
查看镜像元数据
docker inspect a6d2fae9c98c
进入当前正在进行的容器
shell
1.docker exec -it 容器id bashshell
:进入容器开启一个新的终端
2.docker attach 容器id
:进入容器正在执行的
3.docker cp 容器id:容器内路径 目的主机路径
部署Nginx
1.docker search Nginx
2.docker pull Nginx
3.docker run -d --name nginx01 -p 3344:80 nginx
利用Docker搭建code-server
1.拉取镜像
docker pull codercom/code-server
docker images
2.创建挂载目录
# CODE=/home/docker/code
# mkdir $CODE && cd $CODE
3.配置文件
# vim $CODE/config.yaml
将以下内容填入
bind-addr: 127.0.0.1:8080
auth: password
password: 123456
cert: false
4.启动服务
shell
# docker run -d -u root \ #后台以root身份运行
-p 8088:8080 \ #端口映射 主机端口:容器端口
--name code-server \ #起名字
-v $CODE/config.yaml:/root/.config/code-server/config.yaml \ #挂载
-v $CODE:/home/code \ #挂载
codercom/code-server
部署完成
3.Docker进阶
3.1可视化
portainer:图形化界面管理工具!提供一个后台面供我们操作!不常用,不建议使用很卡!
3.2Docker镜像讲解
docker commit 提交容器成为一个新的副本
docker commit -m="提交的信息" -a="作者" 容器id 目标镜像:[tag]
如果想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像;
相当于vm中的快照
3.3 容器数据卷
docker run -it -v 主机目录:容器目录
实战:同步mysql数据库
3.4 DockerFile
常用指令
FROM 镜像
:基础镜像,一切从这里开始构建
MAINTAINER
:镜像是谁写的,姓名+邮箱
WORKDIR /APP
:工作目录(没有目录自动创建目录)
COPY
:将文件拷贝到镜像中
RUN
:构建镜像的时候需要运行的命令
CMD
:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT
:指定这个容器启动的时候要运行的命令,可以追加命令
ADD 可以使用网络源
:复制文件,会自动解压
VOLUME
:设置卷,挂载主机目录
EXPOSE
:指定对外的端口
ONBUILD
:当构建一个被继承Dockerfile 这个时候会运行 ONBUILD 的指令。触发指令
ENV
:构建的时候设置环境变量
构建docker
docker build -f docker文件路径 -t 镜像名:[tag] .
docker history 镜像 : 列出本地进行变更的历史
3.5 Docker网络
两个容器之间是看不见对方的,所以镜像打的端口不能通过在docker内部的127.0.0.1:端口,所以两个镜像要互相访问的时候就需要docker网络的存在;
查看当前主机的网卡:
三张网卡,lo是本机回环的地址,eth0是阿里云内网网卡,docker0是docker的网卡,只要安装就有;
再启动一个容器:查看网卡:
又多了一张网卡,主机上多了一张,容器里也有一张对应的网卡,这叫evth-pair技术,成对出现的网卡,一张在主机上,一张在容器里,使得两个不一个网段的ip能ping通;
这样就可以和主机通信,两个镜像容器通信的时候:
这样就共用了一个docker0的网卡;
查看docker ip:
docker inspect <container_id> | grep IPAddress
Linux查看当前的ip:
1.ifconfig
2.ip addr
3.hostname -I
docker network 相关指令
docker network --help #查看命令帮助文档
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
docker network create --help #查看create命令帮助文档
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge")
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment
创建一个网络
docker network create --driver=bridge #驱动程序类型
--gateway=192.168.137.1 #网关
--subnet=192.168.137.0/16 #子网
mynet #网络名称
其他命令
:::tips
1 查看网络的数据源
docker network inspect 网络名称
2 将容器连接到指定的网络
docker network connect 网络名称 容器id
3 断开容器的网络
docker network disconnect 网络名称 容器id
4 删除所有不在乎使用的网络
docker network prune
5 删除一个或者多个网络
docker network rm 网络名称
6 列出网络
docker network ls
7 创建容器是挂载网络
docker run --name 容器名 -p 80:80 -d --network 网络名 镜像名
:::
注意:如果在起容器的时候加载到某指定的网络,则只会有一个ip地址,并不会桥接到docker0网卡;
如果直接起容器,默认的会带参数--network = bridge,是以桥接的模式桥接在docker0网卡上;
案例
创建mynet网络:
centos01创建不指定网络(默认桥接到docker0):
centos02指定mynet网络:
centos03指定mynet网络:
现在让centos01 ping centos02
ping不通的,因为不在一个网段
centos02 ping centos03
centos02 直接使用名称ping centos03
现在我们将centos01加入到网络中:
centos1是有两个ip的,一个是桥接mynet里的,一个是桥接在docker0上的;然后在centos01 ping centos02
然后查看一下mynet网络:
相比于刚建立的时候多了3个容器;
4.docker compose
安装docker compose
1.curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2.sudo chmod +x /usr/local/bin/docker-compose
3 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. docker-compose version 或者 dockercompose version
安装成功;
案例:拉起一个flask和redis两个镜像的一个web应用程序;
首先创建一个composetest的文件夹,然后创建一个app.py文件:
python
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
这个app.py中的redis是网络上的一个主机名,就是数据库存在于另一个位置,使用的端口是6379,然后创建一个requiremenst.txt来写入依赖;
python
flask
redis
然后创建一个Dockerfile文件:
python
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
从py3.7构建镜像,工作目录选择/code,设置flask的系统环境变量,安装依赖,copy 项目,cmd容器默认启动命令;
然后再创建一个docker-compose.yml 的文件:
python
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- 5000:5000
redis:
image: redis:alpine
该 Compose 文件定义了两个服务:web 和 redis。
- web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
- redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。
执行命令拉起镜像:docker-compose up
如果以后台方式运行 docker-compose up -d
报错,也不知道哪错了,gpt改了一下感觉跟我的一样,但是粘贴进去就对了,😓;
这样就正常构建了;