Docker¶
1 容器命令¶
# search镜像
docter search centos
# images 查看镜像
docker images
# pull镜像
docker pull centos:centos7
# run镜像
docker run --name centos7 -it centos:centos7
# 退出镜像,在容器内部退出
exit
# ps查询容器信息 ,容器id=f0cbcec9bdce
docker ps -a
# stop镜像
docker stop f0cbcec9bdce
# start镜像
docker start f0cbcec9bdce
# attach镜像
docker attach f0cbcec9bdce
# rm容器
docker rm f0cbcec9bdce
# rmi镜像
docker rmi centos:centos7
1.1 ps¶
- 功能:显示容器信息
- 语法:
docker ps [OPTIONS]
-a
:显示所有容器包括Exited状态的-q
:仅仅显示容器id-n num
:限制显示的数量-l
:显示最晚创建的一个容器
1.2 rm¶
- 语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
-f
:强制删除(比如,当容器正在运行时会拒绝删除)- 功能:删除一个或多个容器
- 示例
$ docker rm centos7
centos7
1.3 run¶
- 语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a
:附加到STDIN
,STDOUT
或STDERR
上,默认全部附加-i
、-t
:-i
保持跟容器的交互(stdin),-t
分配终端tty;通常一起使用,使容器在前台运行-d
:让容器后台运行,并打印容器id,与-it
前台运行相反-e
:给容器设置环境变量--env-file [file-path]
:将指定文件内的环境变量给容器--name [string]
:给容器分配名字,如不指定,会自动生成一个--rm
:退出容器时自动删除容器,默认从容器内部退出,容器是exited状态且不会被删除--cidfile [string]
:打印容器id到本地指定文件中-w [path]
:设置容器内工作目录-v [本地目录]:[容器目录]
:将本地目录与容器目录绑定,容器和本地中的此目录数据共享--read-only
:除了-v
挂载的目录,容器内其它目录都不可以写,只能读-p [ip]:[本地端口]:[容器端口]
:将容器端口暴露在指定的本地端口上,ip可以省略- 示例1:
-it
前台运行,-a
指定附加stdin、stdout
$ docker run -a stdin -a stdout -it ubuntu:20.04 /bin/bash
root@bc922be36071:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@bc922be36071:/# exit
exit
- 示例2:
-e
给容器传环境变量
~$ docker run -it --rm -e BB=hello ubuntu:20.04 /bin/bash
root@33c1c21f1f11:/# echo $BB
hello
- 示例3:
--cidfile
打印容器id到指定文件
$ docker run --cidfile docker_id.txt ubuntu:20.04 echo "test"
test
$ cat docker_id.txt
e8a53390efd5f0420317468f64657f503e3e3e7e20387f8ca19a3d07d96ca4df
- 示例4:
-w
设置工作目录
$ docker run -it --rm -w /dev ubuntu:20.04
root@9956dd002094:/dev#
1.3.1 卷挂载-v¶
- 示例:
-v
挂载数据卷,可以看到,xxx目录有了code目录下内容
~$ docker run -it -v /home/shw/code:/home/xxx ubuntu:20.04 /bin/bash
root@49087e5880b0:/# cd /home
root@49087e5880b0:/home# ls
xxx
root@49087e5880b0:/home# cd xxx
root@49087e5880b0:/home/xxx# ls
a.out fun.bin fun.sh fun.sh.x.c levelDB test1.cc test_nice.cc
1.3.2 映射宿主机端口-p和-P¶
title: 容器端口映射宿主机端口作用?
通过宿主机端口映射,可以通过宿主机ip+映射port来访问容器。这样在docker所在主机之外,就能通过宿主机来访问容器。
- 语法形式:
-p [ip]:[本地端口]:[容器端口]
-P
:自动映射容器内所有网络端口,需要在dockerfile里面EXPOSE声明
1.3.2.1 自动映射容器内所有网络端口¶
- 这会随机的选择本地一个端口与容器内端口关联
$ docker run -d -P nginx
d76bb3bec303f06cd5480f11342f4e920f67b30d2af5e35c14660bd8f18447b5
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d76bb3bec303 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:49153->80/tcp magical_austin
1.3.2.2 指定ip和端口¶
- ip可以忽略
$ docker run -d -p 127.0.0.1:8080:80 nginx
ac0173b4fe93d40cfe127fa72a7f58465d205900abfcfc080e141ea89613a657
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac0173b4fe93 nginx "/docker-entrypoint.…" 5 seconds ago Up 2 seconds 127.0.0.1:8080->80/tcp heuristic_elbakyan
1.3.3 网络类型--network¶
host
:容器使用和宿主机相同的网络。(ip相同,hostname、hostid相同)bridge(open)
:容器网络和宿主机不同。(ip不同,hostname、hostid不同)Container(join)
:联合挂载式网络模式,和其他容器共享网络None(Close)
:封闭式网络模式,不为容器配置网络
1.4 exec¶
- 功能:在running状态的容器上执行命令
- 语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-e variable=value
:设置环境变量-w dir
:设置工作目录-it
:分配tty已经附加到标准输入,通常用于进入容器--privileged
:给予额外权限
- 示例
[root@centos7 ~]# docker exec -it nginx01 /bin/bash
root@53e252620494:/# pwd
/
[root@centos7 ~]# docker exec -e dir=/root nginx01 sh -c "echo \$dir"
/root
[root@centos7 ~]# docker exec -w /root nginx01 sh -c "pwd"
/root
1.5 start¶
- 功能:将Exited状态的容器启动
- 语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
- 示例
[root@centos7 ~]# docker start nginx01
nginx01
1.6 restart¶
- 功能:重启容器
- 语法:
docker restart [OPTIONS] CONTAINER [CONTAINER...
- 示例
[root@centos7 ~]# docker restart nginx01
nginx01
1.7 logs¶
title: logs的实现原理?
docker logs会采集容器内所以进程输出到stdout上的内容。通过这种方式,在开发的镜像时,可以通过打印信息到stdout来达到获取容器运行状态的目的
- 示例
$ docker logs 镜像id
1.8 rename¶
- 功能:重命名容器名
- 语法:
docker rename CONTAINER NEW_NAME
- 示例
[root@centos7 ~]# docker rename nginx02 nginx01
[root@centos7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53e252620494 nginx:1.23 "/docker-entrypoint.…" 19 hours ago Up 28 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx01
1.9 cp¶
- 功能:再宿主机和容器间拷贝文件
- 语法:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
:从容器拷贝到宿主机docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
:从宿主机拷贝到容器
- 示例
[root@centos7 ~]# docker cp nginx01:/docker-entrypoint.sh ./
[root@centos7 ~]# ls
anaconda-ks.cfg docker-entrypoint.sh
[root@centos7 ~]# docker cp file1 nginx01:/
[root@centos7 ~]# docker exec -it nginx01 cat /file1
hello
1.10 attach¶
title: attach容器后怎么退出?
1. 当run容器时指定了`-it`参数时,可以是呀`ctrl+p+q`detach
2. 其它情况,只能`ctrl+c`stop容器
- 功能:附加宿主机的标准input, output, and error streams t到运行的容器
- 语法:
docker attach [OPTIONS] CONTAINER
- 示例
# attach后,通过curl 命令访问nginx,将会打印下面的信息
[root@centos7 ~]# docker attach nginx01
172.17.0.1 - - [19/Jul/2022:10:45:21 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
2022/07/19 10:45:23 [notice] 1#1: signal 28 (SIGWINCH) received
2022/07/19 10:45:23 [notice] 1#1: signal 28 (SIGWINCH) received
1.11 port¶
- 功能:显示容器端口映射
- 语法:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
- 示例
[root@centos7 cheat]# docker port nginx01
80/tcp -> 0.0.0.0:49153
80/tcp -> :::49153
1.12 top¶
- 功能:显示容器里面正在运行的进程
- 示例
[root@centos7 ~]# docker top nginx01
UID PID PPID C STIME TTY TIME CMD
root 4771 4750 0 15:14 ? 00:00:00 nginx: master process nginx -g daemon off;
101 4814 4771 0 15:14 ? 00:00:00 nginx: worker process
101 4815 4771 0 15:14 ? 00:00:00 nginx: worker process
2 network命令¶
- 功能:容器的网络操作,包括网络创建、容器间网络联通
- 语法:
docker network COMMAND
ls
:显示网络rm
:删除网络create
:创建一个网络connect
:容器连接到某个网络上disconnect
:容器停止连接到某个网络- 示例:显示网络信息
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
5166c0a84f04 bridge bridge local
afb60ed16654 host host local
b4c95b7a7147 none null local
2.1 创建网络¶
- 语法:
docker network create [OPTIONS] NETWORK
-d[--driver] string
:指定网络类型,默认bridge
--subnet
:网络段--gateway
:网关- 示例
$ docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 myn
et
1b52c8c2216dcf3224ada60de04f4e3668a1bda9f447b6003fab20c1049e49f7
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
5166c0a84f04 bridge bridge local
afb60ed16654 host host local
1b52c8c2216d mynet bridge local
b4c95b7a7147 none null local
2.2 连接网络¶
- 语法:
docker network connect [OPTIONS] NETWORK CONTAINER
ip
: IPv4 address (e.g., 172.30.100.104)ip6
:IPv6 address (e.g., 2001:db8::33)- 示例:将容器tomcat-03连接到网络mynet中
$ docker network connect mynet tomcat-03
3 镜像命令¶
3.1 search¶
- 语法:
docker search [OPTIONS] TERM
--limit int
:限制查询结果数量,默认最多显示25条- 功能:从Docker Hub上查找镜像1
- 示例
$ docker search --limit 3 centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6802 [OK]
ansible/centos7-ansible Ansible on Centos7 135 [OK]
jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 121 [OK]
3.2 images¶
- 语法:
docker images [OPTIONS] [REPOSITORY[:TAG]]
-a
:显示所有镜像(默认)-q
:只显示镜像id- 功能:显示镜像列表
- 示例
# 默认显示
--all
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7 eeb6ee3f44bd 4 weeks ago 204MB
# 显示镜像id
$ docker images -q
eeb6ee3f44bd
3.3 image¶
- 语法:
docker image COMMAND
ls
:显示镜像,和docker imasges
类似build
:从Dockerfile中构建镜像pull
:从镜像库拉取镜像push
:提交镜像到镜像库rm
:删除镜像load
:从tar包中加载镜像save
:保存镜像到tar包中tag
:创建个新镜像并打个标签- 功能:执行镜像相关操作
3.4 pull¶
- 语法:
docker pull [OPTIONS] [镜像仓库地址[:端口号]/]仓库名[:TAG|@DIGEST]
- Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub(docker.io)。
- 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像
-a
:下载镜像的所有tag版本(谨慎使用)-q
:禁止详细输出(一般不用)- 功能:从镜像仓库下载镜像到本地
- 如果不指定标签,默认会下载tag未latest版本
- 如果不知道仓库地址,默认从
docker.io/library/
- 示例
# 指定tag为centos7版本
$ docker pull centos:centos7
# 默认latest版本
$ docker pull centos
Using default tag: latest
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
92dc2a97ff99: Pull complete
be13a9d27eb8: Pull complete
c8299583700a: Pull complete
Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
3.5 rmi¶
- 语法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
-f
:强制删除镜像(比如当镜像的容器还存在会拒绝执行)- 功能:删除一个或多个本地镜像
- 示例
$ docker rmi eeb6ee3f44bd
Error response from daemon: conflict: unable to delete eeb6ee3f44bd (must be forced) - image is being used by stopped container f0cbcec9bdce
$ docker rmi -f eeb6ee3f44bd
Untagged: centos:centos7
Untagged: centos@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9
3.6 build¶
- 功能:从容器构建镜像
- 语法:
docker build [OPTIONS] PATH | URL | -
3.7 save¶
- 功能:将镜像保存为tar包(通常用于镜像迁移)
- 语法:常用以下2种语法
docker save -o image.tar IMAGE
docker save IMAGE > image.tar
- 示例
[root@centos7 ~]# docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.23 41b0e86104ba 8 days ago 142MB
[root@centos7 ~]# docker save nginx:1.23 >nginx.tar
[root@centos7 ~]# ls nginx.tar
nginx.tar
3.8 load¶
- 功能:从tar文件中加载镜像
- 语法:常用以下2种语法
docker load -i image.tar
docker load < image.tar
3.9 tag¶
tag不仅可以修改tag,也可以修改镜像名
- 功能:给镜像打上tag标签
- 语法:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- 示例
[root@centos7 ~]# docker tag nginx:1.23 mynginx:1.0
[root@centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx 1.0 41b0e86104ba 8 days ago 142MB
nginx 1.23 41b0e86104ba 8 days ago 142MB
3.10 history¶
- 功能:查看镜像各层信息
- 语法:
docker history [OPTIONS] IMAGE
- 示例
[root@centos7 ~]# docker history nginx:1.23
IMAGE CREATED CREATED BY SIZE COMMENT
41b0e86104ba 6 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 6 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 6 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 6 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 6 days ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 6 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 6 days ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 6 days ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 6 days ago /bin/sh -c set -x && addgroup --system -… 61.1MB
<missing> 6 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.5 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.23.0 0B
<missing> 6 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 6 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 6 days ago /bin/sh -c #(nop) ADD file:d978f6d3025a06f51… 80.4MB
4 system相关命令¶
4.1 inspect¶
- 功能:显示容器、镜像、网络...的详细信息
- 语法:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
- 示例
[root@centos7 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
036629fb8781 bridge bridge local
935a4c698f1d host host local
9fa841249a88 none null local
[root@centos7 ~]# docker inspect 036629fb8781
[
{
"Name": "bridge",
"Id": "036629fb87819c40a16afa0cd3d31f0616f6b6059f16179c444b7bc1ebf07df3",
"Created": "2022-07-20T11:32:19.846894222+08:00",
...省略...
4.2 system¶
4.2.1 docker system df¶
- 功能:显示磁盘使用情况
- 语法:
docker system df [OPTIONS]
-v
:显示详细信息
- 示例
[root@centos7 ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 2 167.8MB 0B (0%)
Containers 2 2 1.122kB 0B (0%)
Local Volumes 1 1 0B 0B
Build Cache 0 0 0B 0B
4.2.2 docker system info¶
- 作用同
docker info
4.2.3 docker system prune¶
- 功能:清理未使用的数据
- 语法:
docker system prune [OPTIONS]
-a
:清理所有未使用的镜像,而不仅仅是悬空镜像(镜像列表字段REPOSITORY、TAG 为<none>
)--volumes
:删除不再使用的卷(默认不删除)
- 示例
[root@centos7 ~]# docker system prune --volume
unknown flag: --volume
See 'docker system prune --help'.
[root@centos7 ~]# docker system prune --volumes
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all volumes not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Volumes:
6cd5104992124d2a6de106ef8b9fc46fd3e2034bc9502859c950c446b583b3dd
11ab59d5af901f6cf2747cb689fb8a6997e988ef61a1bd637a6685cac95c58ac
Total reclaimed space: 19.89MB
4.3 info¶
- 功能:显示docker信息
- 语法:
docker info
- 示例
[root@centos7 ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 2
Running: 2
Paused: 0
Stopped: 0
Images: 2
...省略...
4.4 stats¶
- 功能:显示容器资源使用统计数据的实时流
- 语法:
docker stats [OPTIONS] [CONTAINER...]
-a
:显示所有容器(默认只显示running状态容器)
- 示例
[root@centos7 cheat]# docker stats nginx01
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
53e252620494 nginx01 0.00% 3.156MiB / 972.4MiB 0.32% 656B / 0B 23.6MB / 8.19kB 3
Dockerfile¶
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
1 常用指令¶
# syntax=docker/dockerfile:1
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
FROM
:指明基础镜像,每一个dockeefile文件都必须从FROM
开始COPY
:从本地拷贝文件到指定的镜像中位置RUN
:执行命令并创建新的镜像层,通常用于安装软件包CMD
:设置容器启动后默认执行的命令,但会被docker run
命令后面的命令行参数替换
2 注释¶
dockerfile的注释同shell脚本,首行字母#表示注释
3 COPY和ADD¶
title: 语法格式
- `ADD [--chown=<user>:<group>] <src>... <dest>`
- `ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]`
- `--chown`用于修改文件的所属组,只能用在linux容器上
1. 当源文件市目录时,不是直接拷贝目录,而是<font color=#FF0211>将目录下的文件拷贝到容器里面</font>,所以我们需要避免拷贝过程污染目标目录
2. COPY也支持模糊匹配,如:`*`、`?`,规则参考[Go匹配规则](https://pkg.go.dev/path/filepath#Match)
- 当COPY多个文件时,容器内目录需要以/结尾
- 当COPY的源路径是文件时,目标路径不以/结尾,则解析目标路径是文件;以/结尾,则解析目标路径为目录;将源文件拷贝到目标目录中
- 当COPY的源路径是目录时,不管目标路径是否以/结尾,都会把目标路径当成目录;将源目录下的文件拷贝到目标目录下
- 当源路径不存在时会自动创建
- 示例
COPY hom* /mydir/
COPY --chown=55:mygroup hom?.txt /mydir/
title: 拷贝多个文件,目标路径没有以/结尾错误提示
When using COPY with more than one source file, the destination must be a directory and end with a /
4 CMD和ENTRYPOINT¶
*注意*:
- CMD指令会被run最后的指令替换,CMD和ENTRYPOINT只能存在一个,如果有多个,最后一个才是有效的。
- shell脚本首行指定脚本解释器,如指定`#!/usr/bin/bash`,否则docker可能使脚本执行失败,导致容器启动失败
CMD
语法:CMD ["executable","param1","param2"]
(exec格式)CMD command param1 param2
(shell格式,默认会被解析为sh -c command param1 param2
)CMD ["param1","param2"]
(当有ENTRYPOINT时,只作为ENTRYPOINT参数,附加在ENTRYPOINT命令后面)ENTRYPOINT
语法:ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
- 示例1:
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
- 示例2
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
5 EXPOSE¶
`EXPOSE` 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。
在 Dockerfile 中写入这样的声明有两个好处:
1. 一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
2. 另一个用处则是在运行时使用随机端口映射时,也就是 `docker run -P` 时,会自动随机映射 `EXPOSE` 的端口。
- 功能:声明需要公开的容器端口,通常在run选项中通过
-P
来将EXPOSE中定义的端口暴露出来 - 语法:
EXPOSE <port> [<port>/<protocol>...]
- 示例:
FROM ubuntu:20.04
EXPOSE 80/tcp
EXPOSE 80/udp
$ docker build -f my_ubuntu3 -t my_ubuntu:20.04 .
$ docker run -it -P --rm my_ubuntu3:20.04 /bin/bash
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db02f8b2ecbe my_ubuntu:20.04 "/bin/bash" 5 seconds ago Up 2 seconds 0.0.0.0:49153->80/tcp, 0.0.0.0:49153->80/udp eloquent_tereshkova
6 ARG和ENV¶
- ENV 定义的环境变量可以被`docker run --env <key>=<value>`时修改
都是定义变量的作用,区别如下
- ARG
:
- 变量只限于dockerfile里面
- 当ARG出现在FROM前时,只能用于FROM指令中,FROM之后的指令不会生效
- ARG是唯一一个可以出现在FROM之前的指令
- ENV
:定义的是环境变量,不仅在dockerfile中生效,也能作为镜像生成的容器的环境变量
- 示例1:ARG出现在FROM前
ARG VERSION=20.04
FROM ubuntu:$VERSION
ENV VERSION2=$VERSION
$ docker build -f my_ubuntu -t my_ubuntu:20.04 .
$ docker run -it my_ubuntu:20.04 /bin/bash
root@2b61dbdd9138:/# echo $VERSION2
root@2b61dbdd9138:/# echo $VERSION
- 输出分析:
- VRERION为空说明ARG不能作用在容器中
- VERSION2为空,说明FROM前的ARG不能在FROM后生效
- 示例2:ARG在FROM后
ARG VERSION1=20.04
FROM ubuntu:$VERSION1
ARG VERSION2=20.04
ARG VERSION1
ENV VERSION11=$VERSION1 VERSION22=$VERSION2
$ docker build -f my_ubuntu2 -t my_ubuntu:20.04 .
$ docker run -it --rm my_ubuntu:20.04 /bin/bash
root@9d17a34421e4:/# echo $VERSION11
20.04
root@9d17a34421e4:/# echo $VERSION22
20.04
- 输出分析:
- VERSION11=20.04表示在FROM后的ARG生效
- VERSION22=20.04表示如果要使用FROM之前的ARG,可以在FROM后使用
ARG 变量
使生效
7 WORKDIR¶
- 功能:指定进入容器后的默认工作目录
- 语法:
WORKDIR /path/to/workdir
- 示例
FROM ubuntu:20.04
WORKDIR /home/root
$ docker run -it -P --rm my_ubuntu:20.04 /bin/bash
root@5070c2aa2879:/home/root# pwd
/home/root
8 USER¶
- 功能:用于指定后续如RUN、CMD、ENTRYPOINT等指令执行的用户(此用户必须已经存在,可以通过RUN命令创建用户)
- 语法:
USER <user>[:<group>]
USER <UID>[:<GID>]
- 示例:创建用户和组,并切换用户
FROM ubuntu:20.04
RUN useradd -m user1 &&\
groupadd g1200 -g 1200
USER user1:g1200
$ docker run -it --rm my_ubuntu:20.04 /bin/bash
user1@d5e09cbda6b4:/$ id
uid=1000(user1) gid=1200(g1200) groups=1200(g1200)
9 VOLUME¶
- 功能:指定容器内挂载点(但不能指定本地挂载点,本地挂载点由docker自动生成,因此一般不使用,一般在run选项中 -v挂载)
10 SHELL¶
- 语法:
SHELL ["executable", "parameters"]
- 功能:
SHELL
指令可以指定RUN
ENTRYPOINT
CMD
指令的 shell,Linux 中默认为["/bin/sh", "-c"]
,并影响所有后续指令 - 示例:第一条RUN,会以
/bin/bash -c ls
执行,第一条RUN会以/bin/bash -cex ls
执行
SHELL ["/bin/sh", "-c"]
RUN ls
SHELL ["/bin/sh", "-cex"]
RUN ls
11 LABEL¶
- 语法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
- 功能:给镜像添加元信息
- 示例
LABEL "com.example.vendor"="ACME Incorporated"
LABEL version="1.0"
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
12 多行命令和减少镜像层¶
\
:多行命令用\
区分(和c语法一样)&&
:连续多条RUN
指令通过&&
来连接(和shell语法一样)- 示例
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
镜像¶
1 查看镜像分层大小¶
docker history 镜像id
- 示例
$ docker history afb6fca791e0
IMAGE CREATED CREATED BY SIZE COMMENT
afb6fca791e0 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:72b194edf3abedf51… 203MB
2 commit从容器中构建镜像¶
3 build从Dockerfile构建镜像¶
- 语法:
docker build [OPTIONS] PATH | URL | -
(注意:PATH是dockerfile文件所在的路径) -f path
:指定要使用的Dockerfile路径,默认名是PATH/Dockerfile
-t name:tag
:设置镜像的名字或便签,格式name:tag- 示例:最后的
.
表示在当前路径下找dockerfile文件
$ docker build -f my_ubuntu3 -t my_ubuntu:20.04 .
仓库¶
1 私有仓库docker-registry安装部署¶
- 拉取
registry
镜像:docker pull registry
- 启动
registry
容器:docker run -d -p 5000:5000 --restart=always --name registry registry
registry
容器需要访问5000端口,宿主机任意端口绑定容器内5000端口--restart=alway
指定容器在exit后,能够重新启动- 仓库默认会在/var/lib/registry下,通过
-v /local-dir:/var/lib/registry
来修改位置
- 现在默认仓库地址是
127.0.0.1:5000
1.1 修改使用内网仓库地址¶
- 修改配置文件
vi /etc/docker/daemon.json
- 增加:
"insecure-registries": ["内网ip:5000"]
- 现在同一网段内的其它机器都能通过
内网ip:port/镜像名:tag
来访问镜像
1.2 修改默认仓库地址¶
- 修改配置文件
vi /etc/docker/daemon.json
- 增加:
ADD_REGISTRY='--add-registry 内网ip:5000'
2 推送镜像到仓库¶
- 给镜像打标签:
docker tag 镜像id registry地址:端口/镜像名:标签
- 推送到仓库:
docker push registry地址:端口/镜像名:标签
` - 其它docker节点上拉取镜像:
docker pull registry地址:端口/镜像名:标签
- 示例
$ docker tag 846e0e5335bb 10.30.12.17:5000/fio:3.7
$ docker push 10.30.12.17:5000/fio:3.7
The push refers to repository [10.30.12.17:5000/fio]
688ef2cc21ed: Pushed
fb82b029bea0: Mounted from apache/zookeeper
3.7: digest: sha256:9cef282efdf8c18e5057821dd085d84de2f9da4a24c008373794749e4fe76364 size: 741
# 在另一台docker节点上执行拉取镜像
$ docker pull heredata/fio:3.7
3 查看私有仓库镜像列表¶
- 语法:
curl registrIp:port/v2/_catalog
- 示例:以下查询到有3个镜像zookeeper、centos、ubuntu
$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["apache/zookeeper","centos","ubuntu"]}
4 查看私有镜像标签¶
- 语法:
curl registrIp:port/v2/镜像名/tags/list
- 示例
$ curl 127.0.0.1:5000/v2/apache/zookeeper/tags/list
{"name":"apache/zookeeper","tags":["v3.4.5","v3.4.14"]}
疑问汇总¶
1 退出容器,却不停止容器¶
在容器内使用Ctrl+P+Q退出,容器依然保持running状态
2 如何在run容器时,不进入容器,但容器保持running状态¶
- 参考
- 容器保持运行状态是因为容器内有个前台进程在运行?所以关键是如何在容器内部启一个前台进程一直存在
-
Docker Hub是一个官方镜像仓库 ↩