安装
Ubuntu
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
# SET UP THE REPOSITORY
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# INSTALL DOCKER CE
sudo apt-get update
sudo apt-get install docker-ce
apt-cache madison docker-ce
# 阿里云公司镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
参考:
- https://docs.docker.com/compose/install/#install-compose
mac
1
2
3
4
brew cask install docker
docker ps
docker-machine create default
命令
run
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
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a, --attach=[] 登录容器(以docker run -d启动的容器)
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d, --detach=false 指定容器运行于前台还是后台
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
-h, --hostname="" 指定容器的主机名
-i, --interactive=false 打开STDIN,用于控制台交互
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
-m, --memory="" 指定容器的内存上限
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置,待详述
-P, --publish-all=false 指定容器暴露的端口,待详述
-p, --publish=[] 指定容器暴露的端口,待详述
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="" 指定容器停止后的重启策略,待详述
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-t, --tty=false 分配tty设备,该可以支持终端登录
-u, --user="" 指定容器的用户
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
-w, --workdir="" 指定容器的工作目录
# 启动一个 bash 终端,允许用户进行交互
docker run -t -i ubuntu:14.04 /bin/bash
# 启动已终止容器
docker container start
- –restart参数,支持三种逻辑实现:
1 2 3
no:容器退出时不重启 on-failure:容器故障退出(返回值非零)时重启 always:容器退出时总是重启
- 网络参数 –net
1
2
3
4
--net=bridge: //使用docker daemon指定的网桥
--net=host: //容器使用主机的网络
--net=container:NAME_or_ID://使用其他容器的网路,共享IP和PORT等网络资源
--net=none: //容器使用自己的网络(类似--net=bridge),但是不进行配置
- 最简单的例子
1
docker run --name myredis -d redis
build
1
docker build -t runoob/ubuntu:v1 .
内置监控
1
2
3
#
docker stats $(docker ps --format={{.Names}})
#
参考: docker stats
一些坑点
docker是有网络瓶颈的,这时可通过 --net=host解决.
Docker 支持的网络模式有:
none。关闭容器内的网络连接
bridge。通过 veth 接口来连接容器,默认配置。
host。允许容器使用 host 的网络堆栈信息。注意:这种方式将允许容器访问 host 中类似 D-BUS 之类的系统服务,所以认为是不安全的。
container。使用另外一个容器的网络堆栈信息。
Cannot connect to the Docker daemon on macOS
1
brew cask install docker
少用 ADD 指令
ADD的另一个功能是能够自动解压缩压缩文件。如果参数是一个识别压缩格式(tar,gzip,bzip2等)的本地文件,那么它将被解压到容器文件系统中的指定处。
参考链接: Dockerfile:ADD VS COPY
entrypoint 执行的容器 接收不到 Unix 信号
entrypoint 通过 sh -c 执行,这会导致应用的pid!=1
要点:
- 所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
- 所以对于 CentOS/RHEL 的用户来说,在没有办法使用 UnionFS 的情况下,一定要配置 direct-lvm 给 devicemapper,无论是为了性能、稳定性还是空间利用率。
- 构建镜像的时候用
&&连接指令,最后需要清理多余的文件 - 应该会将 Dockerfile 置于一个空目录下,或者项目根目录下
- 目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore
一些技巧
查看镜像tag
1
2
3
4
5
brew install httpie
http -a <用户名>:<密码> https://auth.docker.io/token service==registry.docker.io scope==repository:library/nginx:pull
# 把命令结果的token替换到$token
http https://registry.hub.docker.com/v2/library/nginx/tags/list 'Authorization: Bearer $token'
参考
查看Google container的tag
查看容器占用的临时存储
1
2
docker ps
docker inspect <containerid>
结果是一个json,GraphDriver字段里面的内容便是该容器读写层占用的空间
overlay2这种存储驱动,大概长这样
1
2
3
4
5
6
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5-init/diff:/var/lib/docker/overlay2/bc8e51a75f0c75a4c99aee3365e61d819db62c40567d19065803f604c37b037c/diff:/var/lib/docker/overlay2/c6b772109941ef801751cc79df1fff5365d802313e62d891709fa5dc0a77e5ee/diff:/var/lib/docker/overlay2/57825e2f123ee01d2a0316633797eea092d456e86313e57f387f55984539fa12/diff:/var/lib/docker/overlay2/85a562eb1efa7fb47d73c1f3a872eff792e2897fb10acc7f5c3a36a949267ea8/diff:/var/lib/docker/overlay2/175ef167c94fabfcdd71c9c0c00cf84aff09092c525a23eb34ef1abdc5353315/diff:/var/lib/docker/overlay2/7f3e18afdbf72eef8cf3c3c85be17fd690bd8d08ab845351f13e2ab9373f7116/diff:/var/lib/docker/overlay2/6587c9c58d7fbeaa3b2d485033cea9ed16b5e58f5ffb1ab52cbf0ce5d10015db/diff:/var/lib/docker/overlay2/7a5a3316ee39f485f5834604b4ed2943864935601cb53d1ff4e61523236fd7e3/diff:/var/lib/docker/overlay2/e823c204b197123caf2cb190a4a7eb6b1664ef91610578cd3a9230edd9948711/diff:/var/lib/docker/overlay2/5ee74f69388ee558000e54fab92d7f245e38cbcb74d1d428e6e8acb1d84d5785/diff:/var/lib/docker/overlay2/a716238ee065c05799244c3bd375ecc3132f3039f4e041254a150b4900b43c84/diff:/var/lib/docker/overlay2/8cf97acec90c72c19d9efe245d7196a27903c2593d64c34d4fd68c0f3244afe3/diff:/var/lib/docker/overlay2/d31d19d7f6dae649f5318546dd374b7c332dbdab01bc61b7e47bafec0f1a33e9/diff",
"MergedDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/merged",
"UpperDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/diff",
"WorkDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/work"
关于存储驱动,这篇文章讲的还行
清理容器
清理前后使用下列命令可对比效果
docker system df -v
方式1
1
2
3
4
5
6
# 另外可以使用以下命令,来删除所有处于停止(Exited)状态下的容器:
docker rm -v $(docker ps -a -q -f status=exited)
#要删除(所谓的)悬挂卷,您应该输入如下命令:
docker volume rm $(docker volume ls -qf dangling=true)
# 最后,输入以下命令以确保完成清理任务:
docker volume ls -qf dangling=true | xargs -r docker volume rm
1
2
3
4
5
#! /bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径
#!/bin/bash
docker rmi $ (docker images -q -f dangling=true)
docker volume rm $(docker volume ls -qf dangling=true)
0 0 1 ~/docker_clean.sh > /dev/null 2>&1
1
2
3
4
5
6
7
chmod 755 ~/docker_clean.sh
# 其中USER是真实的用户名
sudo usermod -aG docker USER
# 注销后重新登录 我们通过输入以下命令来创建cron作业
crontab –e
# 保存并关闭crontab文件。之后在每个午夜12点,Docker将自动进行清理任务,届时您就可以体验一个干净、整洁的Docker了。
参考:4个实用小技巧,来给你的Docker 进行一次“大扫除”吧
【强烈推荐】方式2
1
2
docker system prune -a
docker system prune --volumes
OOM排查
1
2
grep -i OOM -A 5 -B 5 /var/log/messages
docker ps -a | grep 5c223ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Tasks state (memory values in pages):
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26934] 0 26934 411 128 40960 0 937 entrypoint.sh
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26981] 0 26981 48758 1814 118784 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26982] 65534 26982 69086 25949 323584 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26983] 65534 26983 70117 26791 331776 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26986] 65534 26986 68812 25937 323584 0 937 php-fpm7
--
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 23381] 65534 23381 51941 8278 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29842] 65534 29842 51729 8041 180224 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29854] 65534 29854 50988 7278 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 30426] 65534 30426 52385 8720 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 317] 65534 317 51335 7618 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task=php-fpm7,pid=26865,uid=65534
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Memory cgroup out of memory: Killed process 26865 (php-fpm7) total-vm:367860kB, anon-rss:177544kB, file-rss:1720kB, shmem-rss:13216kB
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom_reaper: reaped process 26865 (php-fpm7), now anon-rss:0kB, file-rss:0kB, shmem-rss:13216kB
5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702 这个就是出现OOM的 container ID
Dockerfile 技巧
变动的层数放最后,可缓存的层放前面
1
2
apt-get -y install -–no-install-recommends
rm -rf /var/lib/apt/lists/*
根据PID查找容器信息
1
2
3
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}, {{.Name}}, {{.Config.Image}}' | grep "^${PID},"
PS: docker inspect 的命令结果是一个json,可以先不加 format ,然后自己定义格式
参考链接: CoreOS - get docker container name by PID?
docker ps 排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker ps --format "table {{.ID}}\t{{.Image}}" | (read -r; printf "%s\n" "$REPLY"; sort -k 2 )
docker ps [--format="TEMPLATE"]
--format="TEMPLATE"
Pretty-print containers using a Go template.
Valid placeholders:
.ID - Container ID
.Image - Image ID
.Command - Quoted command
.CreatedAt - Time when the container was created.
.RunningFor - Elapsed time since the container was started.
.Ports - Exposed ports.
.Status - Container status.
.Size - Container disk size.
.Names - Container names.
.Labels - All labels assigned to the container.
.Label - Value of a specific label for this container. For example {{.Label "com.docker.swarm.cpu"}}
.Mounts - Names of the volumes mounted in this container.
学不动啦
学不动 docker 命令没关系, lazydocker 帮你忙,哪里不会点哪里,妈妈再也不用担心我的 docker 问题.
参考链接:
Installation
Ubuntu
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
# SET UP THE REPOSITORY
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# INSTALL DOCKER CE
sudo apt-get update
sudo apt-get install docker-ce
apt-cache madison docker-ce
# Alibaba Cloud company mirror
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
Reference:
- https://docs.docker.com/compose/install/#install-compose
mac
1
2
3
4
brew cask install docker
docker ps
docker-machine create default
Commands
run
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
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a, --attach=[] Log into container (container started with docker run -d)
-c, --cpu-shares=0 Set container CPU weight, used in CPU sharing scenarios
--cap-add=[] Add permissions, permission list details: http://linux.die.net/man/7/capabilities
--cap-drop=[] Delete permissions, permission list details: http://linux.die.net/man/7/capabilities
--cidfile="" After running container, write container PID value to specified file, a typical monitoring system usage
--cpuset="" Set which CPUs container can use, this parameter can be used for container-exclusive CPU
-d, --detach=false Specify whether container runs in foreground or background
--device=[] Add host device to container, equivalent to device passthrough
--dns=[] Specify container's dns server
--dns-search=[] Specify container's dns search domain, write to container's /etc/resolv.conf file
-e, --env=[] Specify environment variables, container can use this environment variable
--entrypoint="" Override image's entry point
--env-file=[] Specify environment variable file, file format is one environment variable per line
--expose=[] Specify container exposed ports, i.e., modify image's exposed ports
-h, --hostname="" Specify container's hostname
-i, --interactive=false Open STDIN for console interaction
--link=[] Specify associations between containers, use other containers' IP, env, etc.
--lxc-conf=[] Specify container's configuration file, only used when --exec-driver=lxc is specified
-m, --memory="" Specify container's memory limit
--name="" Specify container name, can manage container by name later, links feature requires using name
--net="bridge" Container network settings, to be detailed
-P, --publish-all=false Specify container exposed ports, to be detailed
-p, --publish=[] Specify container exposed ports, to be detailed
--privileged=false Specify whether container is privileged container, privileged containers have all capabilities
--restart="" Specify container restart strategy after stopping, to be detailed
--rm=false Specify container automatically deletes after stopping (doesn't support containers started with docker run -d)
--sig-proxy=true Set proxy to accept and handle signals, but SIGCHLD, SIGSTOP and SIGKILL cannot be proxied
-t, --tty=false Allocate tty device, can support terminal login
-u, --user="" Specify container's user
-v, --volume=[] Mount storage volume to container, mount to a certain directory in container
--volumes-from=[] Mount volumes from other containers to container, mount to a certain directory in container
-w, --workdir="" Specify container's working directory
# Start a bash terminal, allow user interaction
docker run -t -i ubuntu:14.04 /bin/bash
# Start terminated container
docker container start
- –restart parameter supports three logical implementations:
1 2 3
no: Don't restart when container exits on-failure: Restart when container exits with error (non-zero return value) always: Always restart when container exits
- Network parameter –net
1
2
3
4
--net=bridge: //Use bridge specified by docker daemon
--net=host: //Container uses host's network
--net=container:NAME_or_ID://Use another container's network, share IP and PORT and other network resources
--net=none: //Container uses its own network (similar to --net=bridge), but doesn't configure
- Simplest example
1
docker run --name myredis -d redis
build
1
docker build -t runoob/ubuntu:v1 .
Built-in Monitoring
1
2
3
#
docker stats $(docker ps --format={{.Names}})
#
Reference: docker stats
Some Pitfalls
Docker has network bottlenecks, can be solved via ` –net=host`.
Docker supported network modes are:
none. Close network connections inside container
bridge. Connect containers through veth interfaces, default configuration.
host. Allow container to use host’s network stack information. Note: This method will allow container to access system services like D-BUS in host, so it’s considered unsafe.
container. Use another container’s network stack information.
Cannot connect to the Docker daemon on macOS
1
brew cask install docker
Use ADD Instruction Sparingly
ADD’s other function is being able to automatically decompress compressed files. If the parameter is a local file that recognizes compression formats (tar, gzip, bzip2, etc.), it will be decompressed to the specified location in the container filesystem.
Reference links: Dockerfile:ADD VS COPY
Containers executed by entrypoint cannot receive Unix signals
entrypoint executed through sh -c causes application pid!=1
Key Points:
- All file write operations should use data volumes (Volume), or bind host directories. Read-write at these locations skips container storage layer, directly read-write to host (or network storage), with higher performance and stability.
- So for CentOS/RHEL users, when unable to use UnionFS, must configure direct-lvm for devicemapper, whether for performance, stability or space utilization.
- When building images, use
&&to connect instructions, finally need to clean up excess files - Should place Dockerfile in an empty directory, or project root directory
- Some things in directory really don’t want to pass to Docker engine during build, then can write a .dockerignore with .gitignore-like syntax
Some Tips
View Image Tags
1
2
3
4
5
brew install httpie
http -a <username>:<password> https://auth.docker.io/token service==registry.docker.io scope==repository:library/nginx:pull
# Replace command result's token into $token
http https://registry.hub.docker.com/v2/library/nginx/tags/list 'Authorization: Bearer $token'
Reference
Interacting with docker hub v2 API via OAuth
View Google Container Tags
View Container Temporary Storage Usage
1
2
docker ps
docker inspect <containerid>
Result is a json, content in GraphDriver field is the space occupied by this container’s read-write layer
overlay2 this storage driver, roughly looks like this
1
2
3
4
5
6
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5-init/diff:/var/lib/docker/overlay2/bc8e51a75f0c75a4c99aee3365e61d819db62c40567d19065803f604c37b037c/diff:/var/lib/docker/overlay2/c6b772109941ef801751cc79df1fff5365d802313e62d891709fa5dc0a77e5ee/diff:/var/lib/docker/overlay2/57825e2f123ee01d2a0316633797eea092d456e86313e57f387f55984539fa12/diff:/var/lib/docker/overlay2/85a562eb1efa7fb47d73c1f3a872eff792e2897fb10acc7f5c3a36a949267ea8/diff:/var/lib/docker/overlay2/175ef167c94fabfcdd71c9c0c00cf84aff09092c525a23eb34ef1abdc5353315/diff:/var/lib/docker/overlay2/7f3e18afdbf72eef8cf3c3c85be17fd690bd8d08ab845351f13e2ab9373f7116/diff:/var/lib/docker/overlay2/6587c9c58d7fbeaa3b2d485033cea9ed16b5e58f5ffb1ab52cbf0ce5d10015db/diff:/var/lib/docker/overlay2/7a5a3316ee39f485f5834604b4ed2943864935601cb53d1ff4e61523236fd7e3/diff:/var/lib/docker/overlay2/e823c204b197123caf2cb190a4a7eb6b1664ef91610578cd3a9230edd9948711/diff:/var/lib/docker/overlay2/5ee74f69388ee558000e54fab92d7f245e38cbcb74d1d428e6e8acb1d84d5785/diff:/var/lib/docker/overlay2/a716238ee065c05799244c3bd375ecc3132f3039f4e041254a150b4900b43c84/diff:/var/lib/docker/overlay2/8cf97acec90c72c19d9efe245d7196a27903c2593d64c34d4fd68c0f3244afe3/diff:/var/lib/docker/overlay2/d31d19d7f6dae649f5318546dd374b7c332dbdab01bc61b7e47bafec0f1a33e9/diff",
"MergedDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/merged",
"UpperDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/diff",
"WorkDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/work"
Regarding storage drivers, this article explains it pretty well
Clean Containers
Use the following command before and after cleaning to compare effects
docker system df -v
Method 1
1
2
3
4
5
6
# Alternatively, you can use the following command to delete all containers in stopped (Exited) state:
docker rm -v $(docker ps -a -q -f status=exited)
#To delete (so-called) dangling volumes, you should enter the following command:
docker volume rm $(docker volume ls -qf dangling=true)
# Finally, enter the following command to ensure cleanup is complete:
docker volume ls -qf dangling=true | xargs -r docker volume rm
1
2
3
4
5
#! /bin/sh means this script uses /bin/sh to interpret and execute, #! is a special indicator, what follows is the path of the shell that interprets this script
#!/bin/bash
docker rmi $ (docker images -q -f dangling=true)
docker volume rm $(docker volume ls -qf dangling=true)
0 0 1 ~/docker_clean.sh > /dev/null 2>&1
1
2
3
4
5
6
7
chmod 755 ~/docker_clean.sh
# Where USER is the real username
sudo usermod -aG docker USER
# After logging out and logging back in, we create a cron job by entering the following command
crontab –e
# Save and close the crontab file. After that, at midnight every day, Docker will automatically perform cleanup tasks, and you can experience a clean, tidy Docker.
Reference:4 Practical Tips to Give Your Docker a “Big Cleanup”
【Strongly Recommended】Method 2
1
2
docker system prune -a
docker system prune --volumes
OOM Troubleshooting
1
2
grep -i OOM -A 5 -B 5 /var/log/messages
docker ps -a | grep 5c223ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Tasks state (memory values in pages):
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26934] 0 26934 411 128 40960 0 937 entrypoint.sh
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26981] 0 26981 48758 1814 118784 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26982] 65534 26982 69086 25949 323584 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26983] 65534 26983 70117 26791 331776 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26986] 65534 26986 68812 25937 323584 0 937 php-fpm7
--
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 23381] 65534 23381 51941 8278 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29842] 65534 29842 51729 8041 180224 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29854] 65534 29854 50988 7278 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 30426] 65534 30426 52385 8720 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 317] 65534 317 51335 7618 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task=php-fpm7,pid=26865,uid=65534
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Memory cgroup out of memory: Killed process 26865 (php-fpm7) total-vm:367860kB, anon-rss:177544kB, file-rss:1720kB, shmem-rss:13216kB
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom_reaper: reaped process 26865 (php-fpm7), now anon-rss:0kB, file-rss:0kB, shmem-rss:13216kB
5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702 This is the container ID that had OOM
Dockerfile Tips
Put changing layers last, put cacheable layers in front
1
2
apt-get -y install -–no-install-recommends
rm -rf /var/lib/apt/lists/*
Find Container Information by PID
1
2
3
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}, {{.Name}}, {{.Config.Image}}' | grep "^${PID},"
PS: docker inspect command result is a json, can first not add format, then define format yourself
Reference links: CoreOS - get docker container name by PID?
docker ps Sorting
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker ps --format "table {{.ID}}\t{{.Image}}" | (read -r; printf "%s\n" "$REPLY"; sort -k 2 )
docker ps [--format="TEMPLATE"]
--format="TEMPLATE"
Pretty-print containers using a Go template.
Valid placeholders:
.ID - Container ID
.Image - Image ID
.Command - Quoted command
.CreatedAt - Time when the container was created.
.RunningFor - Elapsed time since the container was started.
.Ports - Exposed ports.
.Status - Container status.
.Size - Container disk size.
.Names - Container names.
.Labels - All labels assigned to the container.
.Label - Value of a specific label for this container. For example {{.Label "com.docker.swarm.cpu"}}
.Mounts - Names of the volumes mounted in this container.
Can’t Learn Anymore
Can’t learn docker commands? No problem, lazydocker helps you out, click where you don’t understand, mom no longer needs to worry about my docker problems.
Reference Links:
- Docker Basics-Understanding Communication Between Containers
- 【docker】docker run Command Detailed Explanation
- How to Pass Parameters to Project Inside Docker When Starting Docker
- Network Bottlenecks with Docker Usage
- How to Write docker-compose.yml, Docker compose file Reference Documentation
- Deep Understanding of Docker Volume (One)
- Use volumes
- Docker Container Management
- Install Docker Compose
インストール
Ubuntu
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
# SET UP THE REPOSITORY
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# INSTALL DOCKER CE
sudo apt-get update
sudo apt-get install docker-ce
apt-cache madison docker-ce
# 阿里云公司镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
参考:
- https://docs.docker.com/compose/install/#install-compose
mac
1
2
3
4
brew cask install docker
docker ps
docker-machine create default
コマンド
run
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
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a, --attach=[] コンテナにログイン(docker run -dで起動したコンテナ)
-c, --cpu-shares=0 コンテナのCPU重みを設定、CPU共有シナリオで使用
--cap-add=[] 権限を追加、権限リストの詳細:http://linux.die.net/man/7/capabilities
--cap-drop=[] 権限を削除、権限リストの詳細:http://linux.die.net/man/7/capabilities
--cidfile="" コンテナ実行後、指定ファイルにコンテナPID値を書き込む、典型的な監視システムの使用方法
--cpuset="" コンテナが使用できるCPUを設定、このパラメータはコンテナ専用CPUに使用可能
-d, --detach=false コンテナをフォアグラウンドまたはバックグラウンドで実行するか指定
--device=[] ホストデバイスをコンテナに追加、デバイスパススルーに相当
--dns=[] コンテナのdnsサーバーを指定
--dns-search=[] コンテナのdns検索ドメインを指定、コンテナの/etc/resolv.confファイルに書き込む
-e, --env=[] 環境変数を指定、コンテナ内でこの環境変数を使用可能
--entrypoint="" イメージのエントリーポイントを上書き
--env-file=[] 環境変数ファイルを指定、ファイル形式は1行に1つの環境変数
--expose=[] コンテナが公開するポートを指定、つまりイメージの公開ポートを変更
-h, --hostname="" コンテナのホスト名を指定
-i, --interactive=false STDINを開く、コンソール対話用
--link=[] コンテナ間の関連を指定、他のコンテナのIP、envなどを使用
--lxc-conf=[] コンテナの設定ファイルを指定、--exec-driver=lxcが指定されている場合のみ使用
-m, --memory="" コンテナのメモリ上限を指定
--name="" コンテナ名を指定、後で名前でコンテナを管理可能、links機能は名前を使用する必要がある
--net="bridge" コンテナネットワーク設定、詳細は後述
-P, --publish-all=false コンテナが公開するポートを指定、詳細は後述
-p, --publish=[] コンテナが公開するポートを指定、詳細は後述
--privileged=false コンテナが特権コンテナかどうかを指定、特権コンテナはすべてのcapabilitiesを持つ
--restart="" コンテナ停止後の再起動戦略を指定、詳細は後述
--rm=false コンテナ停止後自動的にコンテナを削除(docker run -dで起動したコンテナはサポートされない)
--sig-proxy=true プロキシが信号を受け取り処理するように設定、ただしSIGCHLD、SIGSTOP、SIGKILLはプロキシできない
-t, --tty=false ttyデバイスを割り当て、ターミナルログインをサポート可能
-u, --user="" コンテナのユーザーを指定
-v, --volume=[] コンテナにストレージボリュームをマウント、コンテナの特定のディレクトリにマウント
--volumes-from=[] 他のコンテナのボリュームをコンテナにマウント、コンテナの特定のディレクトリにマウント
-w, --workdir="" コンテナの作業ディレクトリを指定
# bashターミナルを起動し、ユーザー対話を許可
docker run -t -i ubuntu:14.04 /bin/bash
# 終了したコンテナを起動
docker container start
- –restartパラメータは、3つの論理実装をサポート:
1 2 3
no:コンテナ終了時に再起動しない on-failure:コンテナがエラーで終了(戻り値がゼロ以外)時に再起動 always:コンテナ終了時に常に再起動
- ネットワークパラメータ –net
1
2
3
4
--net=bridge: //docker daemonが指定したブリッジを使用
--net=host: //コンテナがホストのネットワークを使用
--net=container:NAME_or_ID://他のコンテナのネットワークを使用、IPとPORTなどのネットワークリソースを共有
--net=none: //コンテナが独自のネットワークを使用(--net=bridgeに類似)、ただし設定しない
- 最も簡単な例
1
docker run --name myredis -d redis
build
1
docker build -t runoob/ubuntu:v1 .
組み込み監視
1
2
3
#
docker stats $(docker ps --format={{.Names}})
#
参考: docker stats
いくつかの落とし穴
dockerにはネットワークボトルネックがあり、 --net=hostで解決できます。
Dockerがサポートするネットワークモード:
none。コンテナ内のネットワーク接続を閉じる
bridge。vethインターフェースを通じてコンテナを接続、デフォルト設定。
host。コンテナがホストのネットワークスタック情報を使用することを許可。注意:この方法により、コンテナがホスト内のD-BUSなどのシステムサービスにアクセスできるようになるため、安全でないと見なされる。
container。別のコンテナのネットワークスタック情報を使用。
macOSでDocker daemonに接続できない
1
brew cask install docker
ADD命令を控えめに使用
ADDの別の機能は、圧縮ファイルを自動的に解凍できることです。パラメータが圧縮形式(tar、gzip、bzip2など)を認識するローカルファイルの場合、コンテナファイルシステムの指定場所に解凍されます。
参考リンク: Dockerfile:ADD VS COPY
entrypointで実行されるコンテナはUnix信号を受信できない
entrypointがsh -cで実行されると、アプリケーションのpid!=1になる
要点:
- すべてのファイル書き込み操作は、データボリューム(Volume)、またはホストディレクトリのバインドを使用すべきです。これらの場所での読み書きはコンテナストレージレイヤーをスキップし、ホスト(またはネットワークストレージ)に直接読み書きし、パフォーマンスと安定性が向上します。
- したがって、CentOS/RHELユーザーにとって、UnionFSを使用できない場合、パフォーマンス、安定性、またはスペース利用率のいずれのためであっても、devicemapperにdirect-lvmを設定する必要があります。
- イメージを構築する際、
&&で命令を接続し、最後に余分なファイルをクリーンアップする必要がある - Dockerfileを空のディレクトリ、またはプロジェクトのルートディレクトリに配置すべき
- ディレクトリ内の一部のものは、実際にビルド時にDockerエンジンに渡したくない場合、.gitignoreと同じ構文で.dockerignoreを書くことができる
いくつかのヒント
イメージタグを表示
1
2
3
4
5
brew install httpie
http -a <ユーザー名>:<パスワード> https://auth.docker.io/token service==registry.docker.io scope==repository:library/nginx:pull
# コマンド結果のtokenを$tokenに置き換える
http https://registry.hub.docker.com/v2/library/nginx/tags/list 'Authorization: Bearer $token'
参考
Google containerのタグを表示
コンテナが使用する一時ストレージを表示
1
2
docker ps
docker inspect <containerid>
結果はjsonで、GraphDriverフィールドの内容がこのコンテナの読み書きレイヤーが占有するスペースです
overlay2このストレージドライバーは、大体このようになります
1
2
3
4
5
6
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5-init/diff:/var/lib/docker/overlay2/bc8e51a75f0c75a4c99aee3365e61d819db62c40567d19065803f604c37b037c/diff:/var/lib/docker/overlay2/c6b772109941ef801751cc79df1fff5365d802313e62d891709fa5dc0a77e5ee/diff:/var/lib/docker/overlay2/57825e2f123ee01d2a0316633797eea092d456e86313e57f387f55984539fa12/diff:/var/lib/docker/overlay2/85a562eb1efa7fb47d73c1f3a872eff792e2897fb10acc7f5c3a36a949267ea8/diff:/var/lib/docker/overlay2/175ef167c94fabfcdd71c9c0c00cf84aff09092c525a23eb34ef1abdc5353315/diff:/var/lib/docker/overlay2/7f3e18afdbf72eef8cf3c3c85be17fd690bd8d08ab845351f13e2ab9373f7116/diff:/var/lib/docker/overlay2/6587c9c58d7fbeaa3b2d485033cea9ed16b5e58f5ffb1ab52cbf0ce5d10015db/diff:/var/lib/docker/overlay2/7a5a3316ee39f485f5834604b4ed2943864935601cb53d1ff4e61523236fd7e3/diff:/var/lib/docker/overlay2/e823c204b197123caf2cb190a4a7eb6b1664ef91610578cd3a9230edd9948711/diff:/var/lib/docker/overlay2/5ee74f69388ee558000e54fab92d7f245e38cbcb74d1d428e6e8acb1d84d5785/diff:/var/lib/docker/overlay2/a716238ee065c05799244c3bd375ecc3132f3039f4e041254a150b4900b43c84/diff:/var/lib/docker/overlay2/8cf97acec90c72c19d9efe245d7196a27903c2593d64c34d4fd68c0f3244afe3/diff:/var/lib/docker/overlay2/d31d19d7f6dae649f5318546dd374b7c332dbdab01bc61b7e47bafec0f1a33e9/diff",
"MergedDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/merged",
"UpperDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/diff",
"WorkDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/work"
ストレージドライバーについて、この記事はかなりよく説明しています
コンテナをクリーンアップ
クリーンアップ前後で次のコマンドを使用して効果を比較
docker system df -v
方式1
1
2
3
4
5
6
# 別の方法として、停止(Exited)状態のすべてのコンテナを削除するには、次のコマンドを使用できます:
docker rm -v $(docker ps -a -q -f status=exited)
#(いわゆる)ダングリングボリュームを削除するには、次のコマンドを入力する必要があります:
docker volume rm $(docker volume ls -qf dangling=true)
# 最後に、クリーンアップタスクが完了したことを確認するために、次のコマンドを入力します:
docker volume ls -qf dangling=true | xargs -r docker volume rm
1
2
3
4
5
#! /bin/sh は、このスクリプトが/bin/shを使用して解釈および実行することを意味し、#!は特殊な表示子で、その後に続くのはこのスクリプトを解釈するshellのパスです
#!/bin/bash
docker rmi $ (docker images -q -f dangling=true)
docker volume rm $(docker volume ls -qf dangling=true)
0 0 1 ~/docker_clean.sh > /dev/null 2>&1
1
2
3
4
5
6
7
chmod 755 ~/docker_clean.sh
# USERは実際のユーザー名
sudo usermod -aG docker USER
# ログアウトして再ログイン後、次のコマンドを入力してcronジョブを作成します
crontab –e
# crontabファイルを保存して閉じます。その後、毎日深夜12時に、Dockerが自動的にクリーンアップタスクを実行し、クリーンで整頓されたDockerを体験できます。
参考:4つの実用的なヒントでDockerを「大掃除」しましょう
【強く推奨】方式2
1
2
docker system prune -a
docker system prune --volumes
OOMトラブルシューティング
1
2
grep -i OOM -A 5 -B 5 /var/log/messages
docker ps -a | grep 5c223ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Tasks state (memory values in pages):
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26934] 0 26934 411 128 40960 0 937 entrypoint.sh
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26981] 0 26981 48758 1814 118784 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26982] 65534 26982 69086 25949 323584 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26983] 65534 26983 70117 26791 331776 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26986] 65534 26986 68812 25937 323584 0 937 php-fpm7
--
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 23381] 65534 23381 51941 8278 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29842] 65534 29842 51729 8041 180224 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29854] 65534 29854 50988 7278 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 30426] 65534 30426 52385 8720 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 317] 65534 317 51335 7618 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task=php-fpm7,pid=26865,uid=65534
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Memory cgroup out of memory: Killed process 26865 (php-fpm7) total-vm:367860kB, anon-rss:177544kB, file-rss:1720kB, shmem-rss:13216kB
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom_reaper: reaped process 26865 (php-fpm7), now anon-rss:0kB, file-rss:0kB, shmem-rss:13216kB
5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702 これがOOMが発生したコンテナIDです
Dockerfile ヒント
変更されるレイヤーを最後に、キャッシュ可能なレイヤーを前に
1
2
apt-get -y install -–no-install-recommends
rm -rf /var/lib/apt/lists/*
PIDでコンテナ情報を検索
1
2
3
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}, {{.Name}}, {{.Config.Image}}' | grep "^${PID},"
PS: docker inspectのコマンド結果はjsonで、最初はformatを追加せず、その後自分でフォーマットを定義できます
参考リンク: CoreOS - get docker container name by PID?
docker ps ソート
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker ps --format "table {{.ID}}\t{{.Image}}" | (read -r; printf "%s\n" "$REPLY"; sort -k 2 )
docker ps [--format="TEMPLATE"]
--format="TEMPLATE"
Goテンプレートを使用してコンテナをきれいに印刷します。
有効なプレースホルダー:
.ID - コンテナID
.Image - イメージID
.Command - 引用されたコマンド
.CreatedAt - コンテナが作成された時刻。
.RunningFor - コンテナが起動してからの経過時間。
.Ports - 公開されたポート。
.Status - コンテナのステータス。
.Size - コンテナのディスクサイズ。
.Names - コンテナ名。
.Labels - コンテナに割り当てられたすべてのラベル。
.Label - このコンテナの特定のラベルの値。例:{{.Label "com.docker.swarm.cpu"}}
.Mounts - このコンテナにマウントされたボリュームの名前。
もう学べない
dockerコマンドを学べない?問題ありません、lazydockerが手伝います。わからないところをクリックするだけで、お母さんはもう私のdockerの問題を心配する必要がありません。
参考リンク:
Установка
Ubuntu
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
# SET UP THE REPOSITORY
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# INSTALL DOCKER CE
sudo apt-get update
sudo apt-get install docker-ce
apt-cache madison docker-ce
# Зеркало компании Alibaba Cloud
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
Ссылки:
- https://docs.docker.com/compose/install/#install-compose
mac
1
2
3
4
brew cask install docker
docker ps
docker-machine create default
Команды
run
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
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a, --attach=[] Войти в контейнер (контейнер, запущенный с docker run -d)
-c, --cpu-shares=0 Установить вес CPU контейнера, используется в сценариях совместного использования CPU
--cap-add=[] Добавить разрешения, подробности списка разрешений: http://linux.die.net/man/7/capabilities
--cap-drop=[] Удалить разрешения, подробности списка разрешений: http://linux.die.net/man/7/capabilities
--cidfile="" После запуска контейнера записать значение PID контейнера в указанный файл, типичное использование системы мониторинга
--cpuset="" Установить, какие CPU может использовать контейнер, этот параметр можно использовать для эксклюзивного CPU контейнера
-d, --detach=false Указать, работает ли контейнер на переднем плане или в фоновом режиме
--device=[] Добавить устройство хоста в контейнер, эквивалентно сквозной передаче устройства
--dns=[] Указать DNS-сервер контейнера
--dns-search=[] Указать домен поиска DNS контейнера, записать в файл /etc/resolv.conf контейнера
-e, --env=[] Указать переменные окружения, контейнер может использовать эту переменную окружения
--entrypoint="" Переопределить точку входа образа
--env-file=[] Указать файл переменных окружения, формат файла — одна переменная окружения на строку
--expose=[] Указать порты, открытые контейнером, т.е. изменить открытые порты образа
-h, --hostname="" Указать имя хоста контейнера
-i, --interactive=false Открыть STDIN для консольного взаимодействия
--link=[] Указать связи между контейнерами, использовать IP, env и т.д. других контейнеров
--lxc-conf=[] Указать файл конфигурации контейнера, используется только при указании --exec-driver=lxc
-m, --memory="" Указать лимит памяти контейнера
--name="" Указать имя контейнера, позже можно управлять контейнером по имени, функция links требует использования имени
--net="bridge" Настройки сети контейнера, подробности позже
-P, --publish-all=false Указать порты, открытые контейнером, подробности позже
-p, --publish=[] Указать порты, открытые контейнером, подробности позже
--privileged=false Указать, является ли контейнер привилегированным контейнером, привилегированные контейнеры имеют все capabilities
--restart="" Указать стратегию перезапуска контейнера после остановки, подробности позже
--rm=false Указать автоматическое удаление контейнера после остановки (не поддерживает контейнеры, запущенные с docker run -d)
--sig-proxy=true Установить прокси для приёма и обработки сигналов, но SIGCHLD, SIGSTOP и SIGKILL не могут быть проксированы
-t, --tty=false Выделить tty-устройство, может поддерживать вход в терминал
-u, --user="" Указать пользователя контейнера
-v, --volume=[] Подключить том хранения к контейнеру, подключить к определённому каталогу в контейнере
--volumes-from=[] Подключить тома из других контейнеров к контейнеру, подключить к определённому каталогу в контейнере
-w, --workdir="" Указать рабочий каталог контейнера
# Запустить bash-терминал, разрешить взаимодействие с пользователем
docker run -t -i ubuntu:14.04 /bin/bash
# Запустить завершённый контейнер
docker container start
- Параметр –restart поддерживает три логические реализации:
1 2 3
no:Не перезапускать при выходе контейнера on-failure:Перезапускать при выходе контейнера с ошибкой (возвращаемое значение не равно нулю) always:Всегда перезапускать при выходе контейнера
- Сетевой параметр –net
1
2
3
4
--net=bridge: //Использовать мост, указанный docker daemon
--net=host: //Контейнер использует сеть хоста
--net=container:NAME_or_ID://Использовать сеть другого контейнера, совместно использовать IP и PORT и другие сетевые ресурсы
--net=none: //Контейнер использует свою собственную сеть (аналогично --net=bridge), но не настраивает
- Самый простой пример
1
docker run --name myredis -d redis
build
1
docker build -t runoob/ubuntu:v1 .
Встроенный мониторинг
1
2
3
#
docker stats $(docker ps --format={{.Names}})
#
Ссылки: docker stats
Некоторые подводные камни
Docker имеет сетевые узкие места, можно решить через ` –net=host`.
Поддерживаемые Docker сетевые режимы:
none. Закрыть сетевые подключения внутри контейнера
bridge. Подключать контейнеры через интерфейсы veth, конфигурация по умолчанию.
host. Разрешить контейнеру использовать информацию сетевого стека хоста. Примечание: этот метод позволит контейнеру получать доступ к системным сервисам, таким как D-BUS, на хосте, поэтому считается небезопасным.
container. Использовать информацию сетевого стека другого контейнера。
Не удаётся подключиться к Docker daemon на macOS
1
brew cask install docker
Использовать инструкцию ADD экономно
Другая функция ADD — возможность автоматически распаковывать сжатые файлы. Если параметр — это локальный файл, который распознаёт форматы сжатия (tar, gzip, bzip2 и т.д.), он будет распакован в указанное место в файловой системе контейнера.
Ссылки: Dockerfile:ADD VS COPY
Контейнеры, выполняемые entrypoint, не могут получать Unix-сигналы
entrypoint, выполняемый через sh -c, приводит к тому, что pid приложения!=1
Ключевые моменты:
- Все операции записи файлов должны использовать тома данных (Volume) или привязывать каталоги хоста. Чтение-запись в этих местах пропускает слой хранения контейнера, напрямую читает-записывает на хост (или сетевое хранилище), с более высокой производительностью и стабильностью.
- Поэтому для пользователей CentOS/RHEL, когда невозможно использовать UnionFS, необходимо настроить direct-lvm для devicemapper, будь то для производительности, стабильности или использования пространства.
- При сборке образов использовать
&&для соединения инструкций, в конце нужно очистить лишние файлы - Следует поместить Dockerfile в пустой каталог или корневой каталог проекта
- Некоторые вещи в каталоге действительно не хочется передавать в Docker engine во время сборки, тогда можно написать .dockerignore с синтаксисом, подобным .gitignore
Некоторые советы
Просмотр тегов образа
1
2
3
4
5
brew install httpie
http -a <имя_пользователя>:<пароль> https://auth.docker.io/token service==registry.docker.io scope==repository:library/nginx:pull
# Заменить token результата команды в $token
http https://registry.hub.docker.com/v2/library/nginx/tags/list 'Authorization: Bearer $token'
Ссылки
Взаимодействие с docker hub v2 API через OAuth
Просмотр тегов Google Container
Просмотр временного хранилища, используемого контейнером
1
2
docker ps
docker inspect <containerid>
Результат — json, содержимое в поле GraphDriver — это пространство, занимаемое слоем чтения-записи этого контейнера
overlay2 этот драйвер хранения, примерно выглядит так
1
2
3
4
5
6
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5-init/diff:/var/lib/docker/overlay2/bc8e51a75f0c75a4c99aee3365e61d819db62c40567d19065803f604c37b037c/diff:/var/lib/docker/overlay2/c6b772109941ef801751cc79df1fff5365d802313e62d891709fa5dc0a77e5ee/diff:/var/lib/docker/overlay2/57825e2f123ee01d2a0316633797eea092d456e86313e57f387f55984539fa12/diff:/var/lib/docker/overlay2/85a562eb1efa7fb47d73c1f3a872eff792e2897fb10acc7f5c3a36a949267ea8/diff:/var/lib/docker/overlay2/175ef167c94fabfcdd71c9c0c00cf84aff09092c525a23eb34ef1abdc5353315/diff:/var/lib/docker/overlay2/7f3e18afdbf72eef8cf3c3c85be17fd690bd8d08ab845351f13e2ab9373f7116/diff:/var/lib/docker/overlay2/6587c9c58d7fbeaa3b2d485033cea9ed16b5e58f5ffb1ab52cbf0ce5d10015db/diff:/var/lib/docker/overlay2/7a5a3316ee39f485f5834604b4ed2943864935601cb53d1ff4e61523236fd7e3/diff:/var/lib/docker/overlay2/e823c204b197123caf2cb190a4a7eb6b1664ef91610578cd3a9230edd9948711/diff:/var/lib/docker/overlay2/5ee74f69388ee558000e54fab92d7f245e38cbcb74d1d428e6e8acb1d84d5785/diff:/var/lib/docker/overlay2/a716238ee065c05799244c3bd375ecc3132f3039f4e041254a150b4900b43c84/diff:/var/lib/docker/overlay2/8cf97acec90c72c19d9efe245d7196a27903c2593d64c34d4fd68c0f3244afe3/diff:/var/lib/docker/overlay2/d31d19d7f6dae649f5318546dd374b7c332dbdab01bc61b7e47bafec0f1a33e9/diff",
"MergedDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/merged",
"UpperDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/diff",
"WorkDir": "/var/lib/docker/overlay2/a37aa91098cae96ea46461786e1fe5e737e6a9f6659aaecae03cb1a6649f2ec5/work"
Относительно драйверов хранения, эта статья объясняет довольно хорошо
Очистка контейнеров
Использовать следующую команду до и после очистки для сравнения эффектов
docker system df -v
Способ 1
1
2
3
4
5
6
# Кроме того, можно использовать следующую команду для удаления всех контейнеров в остановленном (Exited) состоянии:
docker rm -v $(docker ps -a -q -f status=exited)
#Чтобы удалить (так называемые) висящие тома, вы должны ввести следующую команду:
docker volume rm $(docker volume ls -qf dangling=true)
# Наконец, введите следующую команду, чтобы убедиться, что задача очистки завершена:
docker volume ls -qf dangling=true | xargs -r docker volume rm
1
2
3
4
5
#! /bin/sh означает, что этот скрипт использует /bin/sh для интерпретации и выполнения, #! — это специальный индикатор, за которым следует путь оболочки, которая интерпретирует этот скрипт
#!/bin/bash
docker rmi $ (docker images -q -f dangling=true)
docker volume rm $(docker volume ls -qf dangling=true)
0 0 1 ~/docker_clean.sh > /dev/null 2>&1
1
2
3
4
5
6
7
chmod 755 ~/docker_clean.sh
# Где USER — это реальное имя пользователя
sudo usermod -aG docker USER
# После выхода и повторного входа мы создаём задачу cron, введя следующую команду
crontab –e
# Сохранить и закрыть файл crontab. После этого каждый день в полночь Docker будет автоматически выполнять задачи очистки, и вы сможете испытать чистый, аккуратный Docker.
Ссылки:4 практических совета для «большой уборки» вашего Docker
【Настоятельно рекомендуется】Способ 2
1
2
docker system prune -a
docker system prune --volumes
Устранение неполадок OOM
1
2
grep -i OOM -A 5 -B 5 /var/log/messages
docker ps -a | grep 5c223ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Tasks state (memory values in pages):
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26934] 0 26934 411 128 40960 0 937 entrypoint.sh
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26981] 0 26981 48758 1814 118784 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26982] 65534 26982 69086 25949 323584 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26983] 65534 26983 70117 26791 331776 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 26986] 65534 26986 68812 25937 323584 0 937 php-fpm7
--
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 23381] 65534 23381 51941 8278 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29842] 65534 29842 51729 8041 180224 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 29854] 65534 29854 50988 7278 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 30426] 65534 30426 52385 8720 184320 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: [ 317] 65534 317 51335 7618 176128 0 937 php-fpm7
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podef7ce918_ae07_11e9_bf64_00163e08cd06.slice/docker-5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702.scope,task=php-fpm7,pid=26865,uid=65534
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: Memory cgroup out of memory: Killed process 26865 (php-fpm7) total-vm:367860kB, anon-rss:177544kB, file-rss:1720kB, shmem-rss:13216kB
Jul 30 08:11:33 izwz9hs52qcjvdljv2zxa2z kernel: oom_reaper: reaped process 26865 (php-fpm7), now anon-rss:0kB, file-rss:0kB, shmem-rss:13216kB
5c223edfde3b17676cb982efdc201218a674578704d33d09de4775b721cb4702 — это ID контейнера, в котором произошёл OOM
Советы по Dockerfile
Изменяющиеся слои поместить в конец, кэшируемые слои поместить в начало
1
2
apt-get -y install -–no-install-recommends
rm -rf /var/lib/apt/lists/*
Поиск информации о контейнере по PID
1
2
3
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}, {{.Name}}, {{.Config.Image}}' | grep "^${PID},"
PS: результат команды docker inspect — это json, можно сначала не добавлять format, затем определить формат самостоятельно
Ссылки: CoreOS - get docker container name by PID?
Сортировка docker ps
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker ps --format "table {{.ID}}\t{{.Image}}" | (read -r; printf "%s\n" "$REPLY"; sort -k 2 )
docker ps [--format="TEMPLATE"]
--format="TEMPLATE"
Красиво выводить контейнеры с помощью Go-шаблона.
Допустимые заполнители:
.ID - ID контейнера
.Image - ID образа
.Command - Команда в кавычках
.CreatedAt - Время создания контейнера.
.RunningFor - Прошедшее время с момента запуска контейнера.
.Ports - Открытые порты.
.Status - Статус контейнера.
.Size - Размер диска контейнера.
.Names - Имена контейнеров.
.Labels - Все метки, назначенные контейнеру.
.Label - Значение конкретной метки для этого контейнера. Например {{.Label "com.docker.swarm.cpu"}}
.Mounts - Имена томов, смонтированных в этом контейнере.
Не могу больше учиться
Не можете выучить команды docker? Не проблема, lazydocker поможет вам, где не понимаете — нажимайте, маме больше не нужно беспокоиться о моих проблемах с docker.
Ссылки:
- Основы Docker — понимание связи между контейнерами
- 【docker】Подробное объяснение команды docker run
- Как передать параметры проекту внутри docker при запуске docker
- Сетевые узкие места при использовании Docker
- Как написать docker-compose.yml, справочная документация Docker compose file
- Глубокое понимание Docker Volume (один)
- Use volumes
- Управление контейнерами Docker (Container)
- Install Docker Compose