docker文档和命令帮助

https://docs.docker.com/reference/
https://docs.docker.com/engine/reference/commandline/cli/

aliyun个人加速地址获取

http://cr.console.aliyun.com

docker配置文件

环境配置文件
1
2
3
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker
Unit File
1
/usr/lib/systemd/system/docker.service
docker-ce 配置文件:
1
/etc/docker/daemon.json
Docker Registry配置文件:
1
/etc/containers/registries.conf

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
{
"registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://si7y70hh.mirror.aliyuncs.com/"
],
#开启远程:https://docs.docker.com/config/daemon/remote-access/ 或者 service文件中添加
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd://
"hosts": ["unix:///var/run/docker.sock", "tcp://10.0.0.10:2375"],
"insecure-registries": ["harbor.wang.org"],
"exec-opts": ["native.cgroupdriver=systemd"],
"graph": "/data/docker",  #指定docker数据目录,新版24.0.0不支持,实现:
ExecStart=/usr/bin/dockerd --data-root=/data/docker
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"log-opts": {
  "max-size": "300m",   #指定容器日志文件的最大值
  "max-file": "2"       #指定容器日志文件的个数,循环写入日志文件,即一个日志满,会写入第二个文件
},
"live-restore": true,   #daemon 服务重启,容器依然在运行,不会停止
  "proxies": {           #代理 https://docs.docker.com/network/proxy/
  "default": {
    "httpProxy": "http://proxy.example.com:3128",
    "httpsProxy": "https://proxy.example.com:3129",
    "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
  "tcp://docker-daemon1.example.com": {
    "noProxy": "*.internal.example.net"
  }
}
}
systemctl daemon-reload ;systemctl restart docker.service

Docker 拉取镜像实现代理功能
cat >> /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://${PROXY_SERVER_IP}:${PROXY_PORT}/"
Environment="HTTPS_PROXY=http://${PROXY_SERVER_IP}:${PROXY_PORT}/"
Environment="NO_PROXY=127.0.0.0/8,172.17.0.0/16,10.0.0.0/24,10.244.0.0/16,192.168.0.0/16,wang.org,cluster.local"
EOF

查看docker版本和详细信息

1
2
docker version
docker info

查看docker镜像,容器详细信息

1
docker inspect <容器|镜像>

搜索镜像

1
2
3
docker search <镜像>
docker search -s 100 centos #搜索点赞100个以上的镜像
docker search --filter=stars=100 centos

alpine

安装常见软件
1
apk update && apk --no-cache add bash curl telnet  wget net-tools pstree zip unzip
安装常用编译工具
1
2
3
apk update && apk --no-cache add gcc make curl zip unzip net-tools pstree wget \
libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs pcre pcre2 \
libevent libevent-dev iproute2
修改时区
1
2
3
apk update && apk --no-cache add tzdata \
&& ln -s /usr/share/zoneinfo/Asia/Shanghai \
/etc/localtime && echo "Asia/Shanghai" > /etc/timezone

Debian(ubuntu)系统建议安装的基础包(调试)

1
2
3
4
5
apt update #安装软件前需要先更新索引
apt install procps #提供top,ps,free等命令
apt install psmisc #提供pstree,killall等命令
apt install iputils-ping #提供ping命令
apt install net-tools #提供netstat网络工具等

拉取镜像

1
2
3
4
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

镜像下载保存的路径:
/var/lib/docker/overlay2/镜像ID

查看本地镜像

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
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
-q, --quiet     Only show numeric IDs
-a, --all Show all images (default hides intermediate images)
-f, --filter filter   Filter output based on conditions provided
--format string   Pretty-print images using a Go template

docker images -qa

REPOSITORY      #镜像所属的仓库名称
TAG         #镜像版本号(标识符),默认为latest
IMAGE ID       #镜像唯一ID标识,如果ID相同,说明是同一个镜像有多个名称
CREATED       #镜像在仓库中被创建时间
VIRTUAL SIZE    #镜像的大小

docker images --format
命令用于指定在输出中显示映像信息的格式。格式字符串由多个占位符组成,
每个占位符代表映像的特定属性。
#常用的格式占位符:
{{.Repository}}:映像的仓库名称。
{{.Tag}}:映像的标签。
{{.ID}}:映像的ID。
{{.Digest}}:映像的摘要值。
{{.CreatedAt}}:映像的创建时间。
{{.Size}}:映像的大小

docker images --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}"
docker images --format "{{.Repository}}:{{.Tag}}"
docker images --format "{{.CreatedAt}}\t{{.Repository}}:{{.Tag}}" | sort -k 1 -r
docker images --no-trunc #显示完整的镜像ID
docker images tomcat #只查看指定REPOSITORY的镜像
docker images -f dangling=true #查看dangling状态的镜像

镜像导出

1
2
3
4
5
6
7
8
9
10
11
12
13
docker save [OPTIONS] IMAGE [IMAGE...]
-o, --output string   Write to a file, instead of STDOUT #如果没有-o 往标准输出写

Docker save 使用IMAGE ID导出,在导入后的镜像没有REPOSITORY和TAG,显示为<none>
docker save -o /path/file.tar IMAGE1 IMAGE2 ... #把多个镜像打到一个包中
docker save IMAGE1 IMAGE2 ... > /path/file.tar
docker save IMAGE1 IMAGE2 ... | gzip > /path/file.tar.gz
docker save mysql:5.7.30 alpine:3.11.3 > /data/images.tar

docker save `docker images | awk 'NR!=1{print $1":"$2}'` -o all.tar #导出所有镜像
docker save `docker images | awk 'NR!=1{print $1":"$2}'` | gzip > all.tar.gz
docker image save `docker image ls --format "{{.Repository}}:{{.Tag}}"` -o all.tar
docker image save `docker image ls --format "{{.Repository}}:{{.Tag}}"` | gzip > all.tar.gz

镜像导入

1
2
3
4
5
6
7
8
docker load [OPTIONS]
#选项
-i, --input string   Read from tar archive file, instead of STDIN
-q, --quiet         Suppress the load output

docker load -i /path/file.tar
docker load < /path/file.tar.gz

删除镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm [OPTIONS] IMAGE [IMAGE...]
#选项:
-f, --force     Force removal of the image
   --no-prune   Do not delete untagged parents

docker rmi b59811
docker rmi alpine:3.11.3
docker rmi -f centos:centos8.1.1911
docker rmi nginx tomcat
docker rmi -f `docker images -q`

清理dangling状态的镜像
dangling images表示TAG为<none>的镜像

docker rmi -f `docker images -q -f dangling=true`


清除dangling和不再使用的镜像
docker image prune -a -f

镜像打标签

1
2
3
4
5
6
7
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

#TARGET_IMAGE[:TAG]格式一般形式
仓库主机FQDN或IP[:端口]/项目名(或用户名)/image名字:版本

docker tag alpine alpine:3.11

创建并启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
注意: 容器启动后,如果容器内没有前台运行的进程,将自动退出停止
-it 形式启动的容器 exit 退出会停止容器 ctl+p+q 退出不会停止容器

docker run nginx:1.20
docker run --name web01 nginx:1.20 #--name指定容器名字
docker run --name web01 -d nginx:1.20 #-d 容器放到后台
docker run --name web01 -d -h www.example.com nginx:1.20 #-h 指定容器主机名

#--restart always 跟随宿主机开机自启
docker run --name web01 -d -h www.example.com --restart always nginx:1.20

#-it 交互形式进入容器 同时指定交互shell为sh, 这样会覆盖原来docker内部的执行命令
docker run --name web01 -it -h www.example.com --restart always nginx:1.20 sh

#--priviledge容器获得特权,内部root具有root权限,可以访问和删除宿主机任何文件
docker run --priviledge --name web01 -h www.example.com --restart always nginx:1.20

#--rm 一次性启动容器,停止就删除容器
docker run --priviledge --rm --name web01 -h www.example.com --restart always nginx:1.20

#指定容器启动之后要执行的命令,覆盖容器原来的默认执行的命令 /bin/sh -c "cat /etc/hosts"
docker run --name web01 -it -h www.example.com --restart always nginx:1.20 /bin/sh -c "cat /etc/hosts"
-c 是shell指定参数,从字符串中读取命令执行,而不是标准输入中读取, 也可以不指定sh,而是直接指定命令
docker run --name web01 -it -h www.example.com --restart always nginx:1.20 cat /etc/hosts

查看容器启动时的参数

1
2
3
4
5
6
7
8
9
10
忘记之前启动一个容器的启动命令是什么,现在需要找回来 docker run 的运行参数,可以使用 runlike工具实现
https://github.com/lavie/runlike
#安装方式1: pip
apt install -y python3-pip
pip3 install runlike
#安装方法2: by docker
alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock
assaflavie/runlike"

runlike -p web01 #后面跟容器就可以查看

查看存在的容器

1
2
3
4
5
6
7
8
9
docker ps [OPTIONS]
docker container ls [OPTIONS]

docker ps --format "{{.ID}}\t{{.Image}}\t{{.Status}}"
docker ps -a
docker ps -aq
docker ps -a -s
docker ps -f 'status=exited'

查看容器内的进程

1
2
3
4
docker top CONTAINER [ps OPTIONS]

docker top db144f19

查看容器资源使用情况

1
2
3
docker stats [OPTIONS] [CONTAINER...]
docker stats 251c7c7cf2aa
docker stats #查看所有在运行的容器资源消耗

删除容器

1
2
3
4
5
6
7
8
9
10
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker container rm [OPTIONS] CONTAINER [CONTAINER...]

docker rm -f alpine5
docker rm -f `docker ps -a -q` #删除所有容器
docker rm -f `docker ps -q -f status=running` #删除指定状态的容器
docker rm `docker ps -qf status=exited` #删除所有退出的容器
docker rm `docker ps -qf status=exited`
docker container prune -f

容器的启动和停止

1
2
3
4
docker start|stop|restart|pause|unpause <容器ID>
docker start $(docker ps -a -q)  
docker stop $(docker ps -a -q)  

给正在运行的容器发信号

1
2
3
4
5
docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker kill nginx1
docker kill -s 1 web01
docker kill `docker ps -a -q`

进入正在运行的容器

1
2
3
4
5
6
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
#常见用法
docker exec -it 容器ID sh|bash

#执行一次性命令
docker exec 2478 cat /etc/redhat-release

暴露容器所有端口

1
2
3
4
5
6
7
8
-P , --publish-all= true | false默认为false
docker run -P docker.io/nginx  #映射容器所有暴露端口至随机本地端口


docker port 可以查看容器的端口映射关系
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
docker port nginx-c1

指定端口映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口

方式1: 容器80端口映射宿主机本地随机端口
docker run  -p 80 --name nginx-test-port1 nginx

方式2: 容器80端口映射到宿主机本地端口81
docker run  -p 81:80 --name nginx-test-port2 nginx

方式3: 宿主机本地IP:宿主机本地端口:容器端口
docker run  -p 10.0.0.100:82:80 --name nginx-test-port3 docker.io/nginx

方式4: 宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始
docker run -p 10.0.0.100::80 --name nginx-test-port4 docker.io/nginx

方式5: 宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议
docker run  -p 10.0.0.100:83:80/udp --name nginx-test-port5 docker.io/nginx

方式6: 一次性映射多个端口+协议
docker run  -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx

查看容器的日志

1
2
3
4
5
docker logs 可以查看容器中运行的进程在控制台输出的日志信息
docker 日志是存放在宿主机的 /var/lib/docker/containers/XXXXX/YYYYY-json.log文件中

-f 同 tail -f

传递运行命令

1
2
3
4
5
容器需要有一个前台运行的进程才能保持容器的运行,可以在构建镜像的时候指定容器启动时运行的前
台命令,也可以通过启动容器时传递运行参数实现。容器里的PID为1的守护进程的实现方式

docker run -d alpine tail -f /etc/hosts

容器内部的hosts文件

1
2
3
4
5
容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP


修改容器的 hosts文件
docker run -it --rm --add-host www.example1.com:6.6.6.6 --add-host www.example2.com:8.8.8.8 centos

指定容器 DNS

1
2
3
4
5
6
7
8
9
10
容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址
将dns地址配置在宿主机
在容器启动时加选项 --dns=x.x.x.x
在/etc/docker/daemon.json 文件中指定


docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 centos bash

指定domain名
docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 --dns-search a.com --dns-search b.com busybox

容器内和宿主机之间复制文件

1
2
3
4
5
6
7
8
9
10
不论容器的状态是否运行,复制都可以实现

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
 -a, --archive       Archive mode (copy all uid/gid information)
 -L, --follow-link   Always follow symbol link in SRC_PATH

docker cp b1:/bin/busybox /usr/local/bin/

传递环境变量

有些容器运行时,需要传递变量,可以使用 -e <参数> 或 –env-file <参数文件> 实现
范例: 传递变量创建MySQL
变量参考链接: https://hub.docker.com/_/mysql

1
2
3
4
5
6
docker run --name mysql-test1 -v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=123456 \
-d -p 3306:3306 mysql:5.7.30

清除不再使用的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#dangling images表示TAG为<none>的镜像
docker system prune #执行后出现以下文字

WARNING! This will remove:
 - all stopped containers
 - all networks not used by at least one container
 - all dangling images
 - all dangling build cache
Are you sure you want to continue? [y/N] y

#清除不再使用的镜像
docker system prune -f -a

docker system
df
events
info
prune