跳转至

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, STDOUTSTDERR上,默认全部附加
  • -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 镜像命令

  • 语法: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安装部署

  1. 拉取registry镜像:docker pull registry
  2. 启动registry容器:docker run -d -p 5000:5000 --restart=always --name registry registry
    1. registry容器需要访问5000端口,宿主机任意端口绑定容器内5000端口
    2. --restart=alway指定容器在exit后,能够重新启动
    3. 仓库默认会在/var/lib/registry下,通过-v /local-dir:/var/lib/registry来修改位置
  3. 现在默认仓库地址是127.0.0.1:5000

1.1 修改使用内网仓库地址

  1. 修改配置文件 vi /etc/docker/daemon.json
  2. 增加:"insecure-registries": ["内网ip:5000"]
  3. 现在同一网段内的其它机器都能通过内网ip:port/镜像名:tag来访问镜像

1.2 修改默认仓库地址

  1. 修改配置文件 vi /etc/docker/daemon.json
  2. 增加:ADD_REGISTRY='--add-registry 内网ip:5000'

2 推送镜像到仓库

  1. 给镜像打标签:docker tag 镜像id registry地址:端口/镜像名:标签
  2. 推送到仓库:docker push registry地址:端口/镜像名:标签 `
  3. 其它docker节点上拉取镜像:docker pull registry地址:端口/镜像名:标签
  4. 示例
$ 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状态

  • 参考
  • 容器保持运行状态是因为容器内有个前台进程在运行?所以关键是如何在容器内部启一个前台进程一直存在

  1. Docker Hub是一个官方镜像仓库