操作环境

  • Linux内核3.10
  • CentOS~7.9发行版

安装及配置

点击查看

安装需要的软件包

1
sudo yum install -y yum-utils

设置国内镜像仓库

1
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum软件包索引

1
yum makecache fast

安装docker-ce

1
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

启动docker+开机自启动

1
systemctl start docker && systemctl enable docker

配置docker镜像加速

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jy4tq1fv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

检查docker是否安装好

1
docker info

测试一下hello-world

1
docker pull hello-world     # 可以不需要这一步直接下一步,但是初学者建议多敲敲多熟悉熟悉代码
1
docker run hello-world

相关知识

点击查看

虚悬镜像:既没有仓库名,也没有TAG的镜像(:)

查询:

1
docker images -f dangling=true
1
2
3
4
5
产生的原因:
1、docker build命令未使用-t参数指定仓库名
2、docker pull最新版本的某仓库镜像,则原来的最新版镜像会重命名为<none>:<none>
3、强制删除被运行中的容器占用的镜像
4、docker save命令导出时,使用的是镜像ID,再次导入镜像会变成虚悬镜像

镜像管理

点击查看

增加镜像方法

通过仓库获取镜像

1
docker pull $image_name
1
docker pull $image_name:$version type

通过别人打包的镜像导入

  • 导出
    1
    docker image save $image_name -o 目录/镜像名.tgz        #-o === >
  • 导入
    1
    docker image load -i 目录/镜像名字.tgz                  #-i === <

通过容器构建镜像

1
docker commit $container_id $image_name

通过Dockerfile构建镜像

Dockerfile参数

参数 解释
FROM 基于什么系统发行版
MAINTAINER 作者信息
RUN 运行Linux命令
ADD 添加文件到容器
COPY 复制文件到容器
WORKDIR 指定工作目录
VOLUME 容器数据挂载
EXPOSE 指定容器对外开放的端口
CMD cmd指令
ENTRYPOINT 替换cmd,cmd给它传递参数
ENV 给容器设置环境变量(构建镜像,及容器运行都可以使用)
ARG 给容器设置环境变量(仅构建镜像使用)
USER 用于改变环境,用于切换用户

创建Dockerfile

1
touch Dockerfile

编辑Dockerfile

1
vi Dockerfile

构建镜像

1
docker build .

构建镜像并自定义镜像名

1
docker build -t '镜像名' .

删除指定镜像

1
docker rmi $image_name/id

强行删除指定镜像

1
docker rmi -f $image_name/id

删除全部镜像(危险)—需要没有运行中的容器

1
docker rmi `docker images -aq`

改镜像名字

1
docker tag $image_id $new_name

查看

查看仓库镜像列表

1
docker search $image_name

查看本地镜像列表

1
docker iimages

查看镜像id

1
docker images

自定义查看镜像id和name,其它格式照推

1
docker images --format "table {{.ID}}\t{{.Repository}}\t"

查看镜像详细信息

1
docker image inspcet $image_id
1
docker image inspcet afb

查询镜像的构建历史或分层

1
docker history $image_id

容器管理

点击查看

参数

参数 解释
-d 在容器内运行不占用当前终端
–rm 中止进程后自动删除容器
–name $image_name 自定义容器名字
-it 开启交互式,进入容器内
-v 数据挂载
-p 主机端口:容器端口 端口映射
-P 随机端口映射
–restart=always 监听容器,挂了重启,不和–rm一起用

运行容器

1
docker run 参数 $image_name CMD

进入容器

1
docker run -it $container_id bash
1
docker exec -it $container_id bash

退出容器

1
exit

重启容器

1
docker restart $container_id

删除容器

删除指定容器

1
docker rm $container_id

强行删除指定容器

1
docker rm -f $container_id

删除全部容器(危险)

1
docker rm -f `docker ps -aq`

查看

查看活着的容器id

1
docker ps

查看活着和挂了的容器id

1
docker container ls -a
1
docker container ls -a

查看容器日志

1
docker logs $container_id

查看容器日志(实时更新)

1
docker logs -f $container_id

查看容器的详细信息

1
docker container inspect $container_id

查看容器内资源情况命令

1
docker inspect $container_id

查看容器内进程命令

1
docker top $container_id

查看容器的所有信息

1
docker inspect $container_id

查看容器端口转发情况

1
docker port $container_id

查看容器内ip

1
docker inspect --format '{{.NetworkSettings.IPAddress}}' $container_id

网络管理

点击查看

安装brctl工具

1
yum -y install bridge-utils

自定义docker容器网络

运行一个没有网卡的容器(保留当前窗口)

1
docker run -it --network none centos bash

获取容器ID(新打开ssh窗口)

1
2
docker inspect -f {{.State.Pid}} $container_ID
pid

创建netns

1
2
mkdir /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid

创建VETH接口对

1
ip link add A type veth peer name B

将A端添加到容器并改名

1
2
3
4
5
添加到容器:ip link set A netns $pid
修改网卡名:ip netns exec $pid ip link set dev A name eth0
启动网卡:ip netns exec $pid ip link set dev eth0 up
添加网卡IP地址:ip netns exec $pid ip addr add 172.17.0.16/16 dev eth0
配置网关:ip netns exec $pid ip route add default via 172.17.0.1

将B端添加到docker0

1
2
添加:brctl addif docker0 B
启动网卡B:ip link set B up

自定义网桥

创建

1
docker network create [OPTIONS] NETWORK

容器加入网桥

1
docker network connect <bridge> container

容器断开网桥

1
docker network disconnect <bridge> container

查看本地网络列表

1
docker network ls

删除自定义网桥

1
docker network rm <bridge>

docker run命令的网络配置参数

设置容器的网络链接

1
2
示例1:docker run --net bridge/host/container:container_id/none image_name
示例2:docker run --network bridge/host/container:container_id/none image_name

设置容器的IP地址

1
2
3
4
例子1:docker run -it --rm --network mynet --ip x.x.x.x image bash
例子2:docker network connect --ip 172.50.100.22 network_name container
注意:该方法只适用于用户自定义网络,并且需要人为指定自定义网络的子网信息,即
docker network create --subnet x.x.x.x/x [--gateway *.*.*.*] network_name

设置网络接口MAC地址,DNS,主机名

1
2
3
4
5
6
例子:docker run -it --rm --mac-address 32:56:ac:ef:22:33 centos bash
设置容器的DNS
--dns:设置容器的DNS服务器的IP地址,可以设置多个
--dns-search:设置容器的DNS搜索域
设置主机名
--hostname:为容器指定自定义的主机名

容器之间的网络通信

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
* 容器都连接到同一个网络(参见前面《自定义桥接网络》)
* 多个容器使用host模式
* 容器间使用挂载主机目录
* 容器通过端口映射
* 链接
命令
docker run --link container[:alias]
过程
* 关闭docker服务中的容器互通配置
vi /usr/lib/systemd/system/docker.service
在ExecStart后面添加--icc=false参数
docker daemon-reload
systemctl restart docker
* 启动一个普通容器(使用training/posetgres镜像)
docker run -d --name db training/posetgres
* 使用webapp镜像启动一个连接到db容器的名为web容器
docker run -d --name web --link db:yun1 training/webapp
* 测试
在web容器中安装测试工具
apt-get -y install telnet
telnet db容器的端口
telnet db 5432
* 对立测试
查看db容器的ip地址
使用centos:telnet镜像启动一个容器
在容器中使用telnet命令测试
telnet db_ip 5432

修改docker服务配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
* 修改docker0网桥的默认网段
vi /usr/lib/systemd/system/docker.service
在“ExecStart=”后面添加“--bip 172.56.0.1/16”
* 修改默认网桥
添加网桥(brctl命令需要使用yum -y install bridge-utils命令安装)
brctl addbr br0
ip addr add x.x.x.x/x dev br0
ip link set br0 up
修改docker服务文件
vi /usr/lib/systemd/system/docker.servic
在“ExecStart=”后面添加“--bridge br0”
注意:
-b,--bridge和--bip不可同时存在,只能存在一个
* 添加远程管理docker服务
vi /usr/lib/systemd/system/docker.servic
在“ExecStart=”后面添加“-H tcp://0.0.0.0:2375”
注意:
如果要本地和远程都可以访问,需要保留原有的-H fd://
* 以上操作需要重新加载服务配置并重新启动docker服务
systemctl daemon-reload
systemctl restart docker

存储管理

点击查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
1、联合文件系统
* Union file system
将其他文件系统合并到一个联合挂载点的文件系统
* docker支持的联合文件系统
AUFS、overlayFS、Btrfs、BFS、devicemapper
aufs、overlay、overlay2、btrfs、zfs、devicemapper、vfs
* docker ce支持的Linux发行版的存储驱动
Ubuntu:overlay2、aufs
Debian:overlay2、aufs、devicemapper
CentOS:overlay2
Fedora:overlay2
* 使用overlay2存储驱动的要求
docker版本要求
Docker EE:17.06.02-ee5及以上版本
Docker CE:都支持
Linux内核版本
4.0或更高
RHEL或CentOS:3.10.0-514及更高版本
底层文件系统的要求
ext4
xfs:限于启动d_type的情形
2、docker数据卷
* 卷
默认位置:/var/lib/docker/volume
* 卷分类
命名卷
匿名卷
* 卷的优势
比绑定挂载更容易备份和迁移
可以通过docker命令行或API进行管理
可以在Linux容器和Windows容器中工作
多个容器间共享文件时更安全
支持远程主机或云端存储卷
新卷的内容可以由容器预填充
3、数据卷的使用
* 匿名卷
匿名卷:即不为卷起名字
docker run -v参数
docker run -v [host_src:]container-dest[:<options>]
说明:
host_src:是主机上的文件,可以是文件也可以是目录,匿名卷省略该选项
container-dest:是容器中的挂载点
options:一般使用的是ro和rw,rw是默认的
使用匿名卷,默认存储的位置为/var/lib/docker/volume/${随机码}/_data
随机码如何查看:
docker inspect -f {{.Mounts}} ${容器名|容器ID} |awk '{print $2}'
完整路径查看:
docker inspect -f {{.Mounts}} ${容器名|容器ID}|awk '{print $3}'
dockerfile中的VOLUME指令
语法:
VOLUME ["/data"]
VOLUME mouter1 mounter2...
注意:
dockerfile方式只能挂载匿名卷,默认存储的位置为/var/lib/docker/volume/${随机码}/_data
随机码如何查看:
docker inspect -f {{.Mounts}} ${容器名|容器ID} |awk '{print $2}'
完整路径查看:
docker inspect -f {{.Mounts}} ${容器名|容器ID}|awk '{print $3}'
docker volume create
使用该命令不指定数据卷名也是匿名卷
* 命名卷
# 有名字的数据卷
# 创建:
docker volume create [OPTIONS] [VOLUME]
参数:
-d, --driver string:指定驱动类型,默认为local
# 查看本地卷列表
docker volume ls
# 存储位置
/var/lib/docker/volumes/${volume_name}/_data/
# 使用
docker run -v ${volume_name}:mounter[:options] image
* 删除数据卷
命名卷
docker volume rm [OPTIONS] VOLUME [VOLUME...]
匿名卷
只能删除容器
所有卷(所有未被使用的卷)
docker volume prune

卸载

点击查看

命令真TM多,不学了,卸载了

1
systemctl stop docker
1
yum -y remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
1
rm -rf /var/lib/docker
1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine