重启docker

systemctl restart docker

镜像相关命令

查看镜像

  1. root@shuai:~# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. nginx 1.0.0 bc3c3a0caf79 35 hours ago 133MB
  • REPOSITORY:镜像在仓库的名字
  • TAG:镜像标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建日期
  • SIZE:镜像大小

镜像默认存在Docker宿主机的/var/lib/docker 目录下

搜索镜像

  1. root@shuai:/# docker search busybox
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. busybox Busybox base image. 2309 [OK]
  4. progrium/busybox 70 [OK]

拉取镜像

  1. root@shuai:/# docker pull busybox
  2. Using default tag: latest

删除镜像

  1. # 通过ID删除
  2. docker rmi 62d49f9bab67
  3. # 通过name删除
  4. root@shuai:/# docker rmi busybox
  5. Untagged: busybox:latest
  6. Untagged: busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
  7. Deleted: sha256:69593048aa3acfee0f75f20b77acb549de2472063053f6730c4091b53f2dfb02
  8. Deleted: sha256:5b8c72934dfc08c7d2bd707e93197550f06c0751023dabb3a045b723c5e7b373

容器相关命令

查看容器

  1. # 查看正在运行的容器
  2. root@shuai:~# docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 4ea736ffba4e vite-front:1.0.0 "/docker-entrypoint.…" 35 hours ago Up 35 hours 8001/tcp
  5. # 查看所有容器
  6. root@shuai:~# docker ps -a
  7. # 查看最后启动的容器
  8. docker ps -l
  9. # 列出最近创建的n个容器
  10. docker ps -l -n 5

创建与启动容器

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • -i : 表示运行的容器
  • -t : 容器启动后,会进入其命令行。加入-it两个参数,容器创建就能登录进去,即分配一个伪终端
  • —name : 为创建的容器命名
  • -v : 表示目录映射关系【前者是宿主机目录:后者是映射到宿主机上的目录】,挂载数据盘,可以使用多个-v做多个目录或文件的映射。
  • -d : 在run后面加-d参数,会创建一个守护式容器在后台运行。这样创建容器后不会自动登录容器,如果只加-i和-t两个参数,创建的容器会自动进入容器里面。
  • -p : 表示端口映射【前者是宿主机端口:后者是容器内映射端口】,可以使用多个-p做多个端口映射
  • -P :随机使用宿主机的可用端口与容器内暴露的端口映射。

    创建并进入容器

    docker run -it —name 容器名称B 镜像名称A:标签 /bin/bash
    创建镜像A创建一个容器B,并进入到容器的/bin/bash ```powershell root@shuai:~# docker run -it —name newnginx nginx /bin/bash root@289f826d4c19:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint.d etc lib media opt root sbin sys usr

创建端口映射的容器

root@shuai:~# docker run -it -p 8001:80 —name portnginx nginx /bin/bash

进入容器后,启动nginx

root@40e63158567a:/# nginx

然后就可在端口8002看的nginx界面

  1. <a name="kv0wu"></a>
  2. #### 守护方式创建容器
  3. ```powershell
  4. docker run -di --name 容器名称 镜像名称:tag

登录守护式容器

  1. docker exec -it 容器名称|容器ID /bin/bash

停止与启动容器

  1. # 停止
  2. docker stop 容器名称|容器ID
  3. # 启动
  4. docker start 容器名称|容器ID

文件拷贝

将文件拷贝到容器内可以使用cp命令

  1. # 语法
  2. docker cp 需要拷贝的文件目录 容器名称:容器目录
  3. root@shuai:~# docker cp /code/nodejs portnginx:/usr/share/nginx/html
  4. # 进入到容器
  5. root@shuai:~# docker exec -it portnginx /bin/bash
  6. # 查看拷贝的进入的文件
  7. root@40e63158567a:/# cd /usr/share/nginx/html
  8. root@40e63158567a:/usr/share/nginx/html# ls
  9. 50x.html index.html nodejs

也可以将文件从容器内拷贝出来

  1. # 语法
  2. docker cp 容器名称:容器目录 需要拷贝的文件目录
  3. # 从容器中拷贝出文件
  4. root@shuai:~# docker cp portnginx:/usr/share/nginx/html /code/nginx
  5. # 查看拷贝出来的文件内容
  6. root@shuai:/code/nginx# ls
  7. 50x.html index.html

目录挂载

创建容器后,将宿主机的目录与容器内的目录进行映射,就可以通过修改宿主机某个目录的文件内容直接修改容器内的文件内容。这个操作是双向绑定的,容器内修改文件内容也会同步影响宿主机内容,实现数据备份功能。
容器被删除后,宿主机的内容并不会被删除。
如果多个容器挂载同一个目录,其中一个容器被删除,其他容器内容不会受到影响。

容器与宿主机直接的数据卷属于引用关系,数据卷是从外界挂载到容器内的,所以可以脱离容器的生命周期而独立存在。 由于数据卷的生命周期并不同于容器的生命周期,在容器退出或删除后,数据卷不受影响,数据卷的生命周期会一直持续到没有容器使用它为止。

创建容器添加 -v 参数,格式为 宿主机目录:容器目录

  1. # 创建本地/code/nginx目录和容器的/usr/share/nginx/html目录关联
  2. root@shuai:~# docker run -di -p 8002:80 -v /code/nginx:/usr/share/nginx/html --name filev nginx
  3. # 修改本地的文件
  4. root@shuai:/code/nginx# vi index.html
  5. # 查看容器内的文件,首先进入容器
  6. root@shuai:/code/nginx# docker exec -it filev /bin/bash
  7. # 切换文件目录
  8. root@33e0165d28b5:/# cd /usr/share/nginx/html/
  9. root@33e0165d28b5:/usr/share/nginx/html# ls
  10. 50x.html index.html
  11. # 查看index的内容
  12. root@33e0165d28b5:/usr/share/nginx/html# cat index.html

docker run -di -p 宿主机端口:容器服务端口 -v 宿主机目录:容器目录 —name nginxVolumes nginx 多目录挂载 docker run -di -p 宿主机端口:容器服务端口 -v 宿主机目录:容器目录 -v 宿主机目录2:容器目录2 —name nginxVolumes2 nginx

匿名挂载

匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volumes 中生成。

  1. # 匿名挂载到本地,创建nginx容器
  2. docker run -di -v /usr/share/nginx/html --name nginx01 nginx
  3. # 查看volumes 数据卷信息
  4. root@shuai:/var/lib/docker/volumes# docker volume ls
  5. DRIVER VOLUME NAME
  6. local 3361051ffb7a8a726cfdb2de09f65334139cbcccf9407eaf8573f092b8a88882
  7. local cd5d8ac03b4034ddc9eb461f7c110fdd2d0ce0fe5aad7d979f8d47ddf938f914
  8. # 切换目录到cd5d8
  9. root@shuai:cd5d8...# cd _data/
  10. root@shuai:cd5d8.../_data# ls
  11. 50x.html index.html
  12. # 修改index文件就会同步更新

查看匿名挂载的数据卷和容器的对应关系
通过 docker inspect nginx02 ,查看Mounts的Source路径

  1. #编辑数据卷
  2. docker volume ls : List volumes
  3. docker volume prune : Remove all unused local volumes
  4. docker volume rm : Remove one or more volumes

具名挂载

具名挂载是给数据卷起个名字,容器外对应的目录会在/var/lib/docker/volume 中生成。

  1. # 指定数据卷名称set_nginx02_volume,位置还是在/var/lib/docker/volume下
  2. docker run -di -v set_nginx02_volume:/usr/share/nginx/html --name nginx01 nginx

指定目录挂载

  1. docker run -di -p 8003:80 -v /code/nginx:/usr/share/nginx/html --name filev nginx

如果在创建容器是没有进行目录挂载,可以修改Mounts

  1. docker inspect 容器名 修改Mounts
  2. # 查找到json并修改
  3. vi /var/lib/docker/containers/container-ID/config.v2.json
  4. #修改配置文件中的目录位置,然后保存退出
  5. "MountPoints":{
  6. "/home":{
  7. "Source":"/docker",
  8. "Destination":"/home",
  9. "RW":true,
  10. "Name":"",
  11. "Driver":"",
  12. "Type":"bind",
  13. "Propagation":"rprivate",
  14. "Spec":{"Type":"bind","Source":"//docker/","Target":"/home"}
  15. }
  16. }

查看目录挂载关系

  1. docker volume inspect set_nginx02_volume

只读/读写

  1. # 只读,通过修改宿主机内容实现对容器的数据管理
  2. docker run -it -v /宿主机目录:/容器目录:ro 镜像名
  3. # 读写,默认。宿主机和容器可以双向操作数据
  4. docker run -it -v /宿主机目录:/容器目录:rw 镜像名

volumes-from(继承)

  1. # 容器nginx02 指定目录挂载
  2. docker run -di -p 8003:80 -v /code/nginx:/usr/share/nginx/html --name nginx02 nginx
  3. # 容器nginx03/nginx04 都继承nginx02的挂载目录
  4. docker run -di --volumes-from nginx02 --name nginx03 nginx
  5. docker run -di --volumes-from nginx02 --name nginx04 nginx

查看容器IP地址

可以通过查看容器元信息
docker inspect 容器名|ID
也可执行下面命令直接输出IP地址

  1. docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名|ID

删除容器

只能删除未启动的容器,启动的容器需要先停止stop或kill

  1. # 停止运行的容器
  2. docker stop portnginx
  3. # 删除容器
  4. docker rm protnginx

Dockerfile

官方说明:https://docs.docker.com/engine/reference/builder/
在Docker中构建镜像最常用的方式是使用Dockerfile。Dockerfile是一个用来构建镜像的文本文件,该文件包含了多条构建镜像所需的指令和说明。使用docker build 用户可以创建连续执行多个命令行指令的自动构建。
使用当前目录 ( .) 作为构建上下文的构建命令:

  1. $ docker build .

要提高构建的性能,可通过将 .dockerignore 文件添加到上下文目录来排除文件和目录。
格式Dockerfile

  1. # Comment
  2. INSTRUCTION arguments

该指令不区分大小写。但是,约定是将它们大写,以便更容易地将它们与参数区分开来。
DockerDockerfile按顺序运行指令。一个Dockerfile 必须以开始FROM的指令。这可能在解析器指令注释和全局范围的 ARG 之后。该FROM指令指定您正在构建的父映像。FROM前面只能有一个或多个ARG指令,这些指令声明FROM在Dockerfile.

From指令

语法:From Docker操作命令 - 图1:
指明构建的新镜像来自远哪个基础镜像,如果没有选择tag,默认使用latest
FROM centos:7

如果不以任何镜像为基础,可以使用scratch。 官方说,scratch镜像是一个空惊喜,可以用于构建busybox等超小镜像。

LABEL

语法:LABEL = = =
功能是给镜像指定标签,也可以用LABEL来指定镜像作者

  1. LABEL maintainer="shenshuai89"

RUN

语法:RUN
构建镜像时运行的shell命令,比如构建的新镜像中想在/usr/local目录下创建一个java目录

  1. RUN mkdir -p /usr/local/node

ADD

语法:ADD
拷贝文件或目录到镜像中。src可以是本地文件或压缩包,压缩文件会自动解压。还可以是一个url,如果把src设置为url,那么ADD类似于wget命令,然后自动下载和解压。

  1. ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java

COPY

语法:COPY
拷贝文件或目录到镜像,用法和ADD相似,只是不支持自动下载和解压。
COPY指令从中复制新文件或目录 并将它们添加到容器的文件系统中的路径

  1. COPY jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java

EXPOSE

通知DOCKER容器运行时的监听端口给外部,可以指定端口是监听TCP还是UDP,如果未指定协议,默认TCP。
EXPOSE指令实际上并未发布端口。它充当构建镜像的人和运行容器的人之间的一种文档,关于打算发布哪些端口。

  1. EXPOSE <port> [<port>/<protocol>...]
  2. # 应用
  3. EXPOSE 80 443 8080/tcp

无论EXPOSE设置如何,您都可以在运行时使用-p标志覆盖它们。

  1. docker run -p 80:80/tcp -p 80:80/udp

ENV

设置容器内的环境变量
语法:

  • ENV : 添加单个参数
  • ENV = = : 添加多个参数 ```powershell

    单条添加

    ENV MY_NAME=”John Doe” ENV MY_DOG=Rex\ The\ Dog ENV MY_CAT=fluffy

多条添加

ENV MY_NAME=”John Doe” MY_DOG=Rex\ The\ Dog \ MY_CAT=fluffy

  1. <a name="D6IqI"></a>
  2. ### CMD
  3. CMD和ENTRYPOINT指令定义运行的容器中时什么命令得到执行。
  4. 1. Dockerfile 应至少指定CMD或ENTRYPOINT命令之一。
  5. 2. ENTRYPOINT 应在将容器用作可执行文件时进行定义。
  6. 3. CMD应该用作定义ENTRYPOINT命令的默认参数或在容器中执行临时命令的一种方式。
  7. 4. CMD 使用替代参数运行容器时将被覆盖。
  8. CMD指令有三种形式
  9. - CMD ["executable","param1","param2"] :比如CMD ["/usr/local/tomcat/bin/runshell.sh", "run"]
  10. - CMD ["param1","param2"] : 比如 CMD [ "echo", "$JAVA_HOME"]
  11. - CMD command param1 param2: 比如:CMD echo $JAVA_HOME
  12. 启动容器执行shell命令,在Dockerfile中只能有一条CMD指令,如果是多条,只有最后一条CMD生效
  13. > 如果创建容器的时候指定命令,则CMD命令会被替代。如果想不被覆盖,使用下一条命令ENTRUPOINT
  14. > docker run -it --name nginx02 nginx echo "hello nginx"
  15. > docker run -it --name nginx03 nginx /bin/bash
  16. > 以上两条指向就不会数据配置的环境变量信息,因为CMD被echo "hello nginx" 和/bin/bash覆盖
  17. <a name="MXKGT"></a>
  18. ### ENTRUPOINT
  19. ENTRYPOINT 有两种形式:
  20. ```powershell
  21. # 第一种
  22. ENTRYPOINT ["executable", "param1", "param2"]
  23. 示例: ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run"]
  24. # 第二种
  25. ENTRYPOINT command param1 param2
  26. 示例:ENTRYPOINT echo $JAVA_HOME

启动容器时设置的shell命令,同CMD类似,但是不会被docker run命令行指定的参数覆盖
在Dockerfile中只能有一条ENTRYPOINT指令,如果设置多条,只有最后一天生效。

WORKDIR

为RUN/CMD/ENTRYPOINT/COPY/ADD设置工作目录
语法:WORKDIR /path/to/workdir
该WORKDIR指令可以在一个Dockerfile. 如果提供了相对路径,它将相对于前一条WORKDIR指令的路径 。

  1. WORKDIR /a
  2. WORKDIR b
  3. WORKDIR c
  4. RUN pwd

最终pwd命令的输出Dockerfile将是/a/b/c.

VOLUME

语法:VOLUME [“/data”]

  1. VOLUME ["/var/lib/mysql"]

VOLUME指令创建一个具有指定名称的挂载点到宿主机,并将其标记为保存来自本机主机或其他容器的外部挂载卷。
该值可以是 JSON 数组、VOLUME [“/var/log/“]或带有多个参数的纯字符串,例如VOLUME /var/log或VOLUME /var/log /var/db。

  1. FROM ubuntu
  2. RUN mkdir /myvol
  3. RUN echo "hello world" > /myvol/greeting
  4. VOLUME /myvol

Dockerfile 会docker run生成一个映像,该映像会导致创建新的挂载点/myvol并将greeting文件复制 到新创建的卷中