Docker介绍

https://jiajially.gitbooks.io/dockerguide/content/dockerIND.html

镜像 image

Docker镜像是Linux的文件系统(Root FileSystem),该文件系统里面包含可以运行Linux内核的程序以及数据。
通过镜像可以创建容器,一个镜像就是一个可执行的包,其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件。
Docker把App文件打包成一个镜像,并且采用类似多次快照的存储技术可以实现以下内容:

  • 多个App可以共用相同的底层镜像
  • App运行时的IO操作和镜像文件隔离
  • 通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个APP镜像可以用来运行无数个不同业务的容器 | 命令 | 说明 | 语法 | 示例 | | —- | —- | —- | —- | | ls | 查看全部镜像 | docker images | | | search | 查找镜像 | docker search [imageName] | | | history | 查看镜像历史 | docker history [imageName] | | | inspect | 显示镜像详细信息 | docker inspect [imageName] | | | pull | 拉取镜像 | docker pull [imageName] | | | push | 推送一个镜像到镜像仓库 | docker push [imageName] | | | rmi | 删除镜像 | docker rmi [imageName] | docker rmi 7e0aa2d69a15 | | prune | 移除未在使用的镜像,没有任何标记或任何容器引用 | docker image prune | | | tag | 标记本地镜像,将其归入某个仓库 | docker tag [options] image:[tag] [REPOSITORY]/[username]/name:tag | docker tag centos:7 shenshuai/centos:v1 | | export | 将容器文件系统作为一个tar归档,到处到stdout | docker export [options] [containerId] | docker export -o latestubuntu.tar 80055d6c3440 | | import | 导入容器快照文件系统tar归档文件,并创建镜像 | docker import [option] file/url/[REPOSITORY:tag] | docker import latestubuntu.tar | | save | 将制定的镜像保存为tar文件 | docker save [options] image [image] | docker save -o latestubuntu.tar ubuntu:latest | | load | 加载tar文件并创建镜像 | docker save [options] image [image] | docker load -i latestubuntu.tar | | build | 基于Dockerfile构建镜像 | docker build [options] path /url | |

save和export区别:save通过镜像保存的文件,export通过容器生成的文件
load和import区别:都是把rar文件导入镜像,load不能指定名字和标签,因为save时已经携带有名字和标签信息

拉取镜像pull

  1. docker pull centos
  2. # 支持后返回
  3. Using default tag: latest
  4. latest: Pulling from library/centos
  5. 7a0437f04f83: Pull complete
  6. Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
  7. Status: Downloaded newer image for centos:latest
  8. docker.io/library/centos:latest

查看镜像列表images

  1. docker images

image.png
基于拉取镜像,创建一个容器

export导出镜像

  1. docker export -o latestubuntu.tar 80055d6c3440

image.png

import导入镜像

image.png

删除镜像 rmi

docker rmi 【镜像id/或镜像REPOSITORY】
image.png

删除未使用的镜像prune

  1. // 清除没有被容器使用的镜像文件
  2. docker image prune -af
  3. // 清除多余的数据,包括停止的容器、多余的镜像、未被使用的volume
  4. docker system prune -f

image.png

容器container

容器是通过镜像创建出来的实例。就像面向对象程序设计的类和对象关系,镜像是静态的类,容器是镜像的运行实体。
容器可以被创建、启动、停止、删除、暂停。

命令 说明 语法 示例
run 从镜像运行容器 docker run [options] imageName [command] docker run -it centos /bin/bash
ls 列出容器 docker container ls
inspect 显示容器的详细信息 docker inspect [containerID]
exec 进入正在运行的docker容器,执行命令 docker exec -it [containerID] /bin/bash docker exec -it d196755b8453 /bin/bash
stats 显示容器资源使用统计 docker stats
top 显示容器运行的进程 docker top [containerID]
update 更新容器配置
port 列出指定容器端口映射 docker container port【containerID】 docker container port okewijx23或者
docker run -d -p 8080:80 nginx
image.png
ps 查看当前运行的容器,
-a可以查看所有容器
-l 查看最新容器
docker ps
kill 终止容器运行 docker kill 【containerID】
start 启动停止运行的容器 docker start 【containerID】
stop 终止容器运行 docker stop 【containerID】
rm 删除容器 docker rm 【containerID】 删除所有容器
docker container rm $(docker container ps -a -q)
cp 从正在运行的Docker容器里面,将文件拷贝到本机 docker container cp 【containerID】:filePath . docker container cp 5329e8afe31b:/usr/new.txt .
image.png
commit 根据容器创建新镜像 docker commit -m”设置的message” -a”作者” 【容器ID】 【生产镜像的信息】:tag -> docker commit -m”set node” -a”shenshuai” 89a4e724bd79 shenshuai/mysetnode:v5
image.png
logs 查看docker容器的输出 docker logs 【containerID】

创建容器create

  1. > docker create --name ubuntuContainer ubuntu:18.04
  2. 0da83bc6515ea1df100c32cccaddc070199b72263663437b8fe424aadccf4778

启动容器 start

  1. docker start ubuntuContainer
  2. #或者
  3. docker start 0da83bc6515ea

进入/退出容器 exec /exit

  1. # 进入容器并启动命令
  2. docker container exec -it 25518b008113 /bin/bash
  3. # sh -c 可以运行shell命令
  4. sh -c "echo hello"
  5. #可以进行正在运行的busybox容器
  6. docker exec -it 5329e8afe31b /bin/sh

创建容器时,参数含义

参数 说明
-i —interactive 交互式
-t -tty 分配一个伪终端
-d —detach 运行容器到后台
-a —attach list 附加到运行容器
-e —env list 设置环境变量
-> docker run -it -e username=”shenshuai” busybox /bin/sh
-> . echo ${username}
-p —publish list 发布容器端口到主机
-P —publish-all

退出容器,直接使用exit
进入启动容器,必须确保容器是运行状态

查看容器 ps

docker ps
docker ps -a //可以查询出容器的id/name/command/status/ports/image等
image.png

  1. # 启动容器
  2. docker container start 25518b008113
  3. # 停用容器
  4. docker container stop 25518b008113
  5. # kill容器
  6. docker container kill 25518b008113
  7. # 删除容器
  8. docker rm 25518b008113

docker run创建并进入容器

docker run 命令参数解释

  • -i :以交互模式运行容器,通常与 -t 同时使用命令解释
  • -t :为容器重新分配一个伪输入终端,通常与 -i 同时使用
  • -d :后台运行容器,并返回容器ID
  • -p:80:80 将容器内80端口映射至宿主机80端口
  • -v : /home/docker_data/nginx:/etc/nginx 将容器/etc/nginx目录挂载到宿主机/home/docker_data/nginx目录下,若宿主机内此目录不存在将会自动创建
  • –restart always :容器自启动
  • –privileged=true :让容器获取宿主机root权限
  • –name gitlab :设置容器名称为gitlab
  • ubuntu:18.04 :镜像的名称,这里也可以写镜像ID
  • /bin/bash:进入容器时的交换命令

    1. docker run -it --name runUbuntuContainer ubuntu:18.04 /bin/bash

    image.png

    创建在后台执行容器,并端口映射

    1. docker run -d --name mynginx -p 8123:80 nginx

    docker执行之后,容器不能正常运行,可以通过docker log ,查看报错日志。

    在容器中安装Node环境

    进入容器后,一切操作和普通环境一样,可以通过nvm安装node环境

    1. > apt-get update
    2. > apt-get install wget
    3. > wget -O- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

    安装过程可能会出现
    Connecting to raw.githubusercontent.com failed: Connection refused.
    出现报错是由于连接的网络环境问题
    解决方法:

  • 查询raw.githubusercontent.com的真实IP
    https://www.ipaddress.com/ 查询raw.githubuercontent.com的真实IP。

  • 修改hosts
    在/etc/hosts/中绑定查到的host,例如:

    1. sudo vim /etc/hosts
    2. #绑定host
    3. 185.199.108.133 raw.githubusercontent.com
    4. 185.199.109.133 raw.githubusercontent.com
    5. 185.199.110.133 raw.githubusercontent.com
    6. 185.199.111.133 raw.githubusercontent.com

    安装完之后可能当前 session 读不到 nvm 命令,可以 exit 之后再进入中终端环境。如果在容器内,可以执行 source .bashrc 来更新环境配置。

    1. nvm --version //打印出版本号,则安装成功

    commit容器,创建新的镜像

    安装好的环境,希望能够在其它地方使用来创建容器,可以把刚安装了node 环境的容器进行commit为镜像。

    1. -> docker commit --author "shenshuai" --message "node env" 89a4e72 shenshuai/mynode:v1
    2. -> 成功后返回sha256:80a3185ec8de35ea3963c0ad8271b1dd4defe87ef351ba9422598169fcc408c6
    3. # -a作者信息 -m生成镜像的信息
    4. -> docker commit -m"set node" -a"shenshuai" 89a4e724bd79 shenshuai/mysetnode:v5
    5. -> sha256:8b631abcd27037fef7c06b1b3ed0e894f7ae92ddbbadff5f5c33e0d90a20bba1

    通过docker images就可以看到新生成的镜像
    image.png
    接下来就可以使用新创建的镜像生成容器

    1. docker run -it --name newWorkSpace shenshuai/mynode:v1 /bin/bash

    push定制的镜像到docker hub

    登陆已经注册好的docker hub账号,https://hub.docker.com/

    1. docker login
    2. docker push shenshuai/mynode:v1
    3. The push refers to repository [docker.io/shenshuai/mynode]
    4. 690e02c6ec26: Pushed
    5. 5f08512fd434: Pushed
    6. c7bb31fc0e08: Pushed
    7. 50858308da3d: Pushed
    8. v1: digest: sha256:31437ead322e5c348c377755e819bf960c57178bc0755c39ef57e712817f3750 size: 1156

    这样就可以将本地配置的镜像上传hub仓库,方便在其它系统环境使用。

    Dockerfile,可以快速生成定制化镜像

    Dockerfile 的格式统统为:

    1. # Comment INSTRUCTION arguments

    必须以 FROM BASE_IMAGE 开头指定基础镜像。
    更详细的规范与说明请参考 Dockerfile reference。这里我们以基于上面的
    Dockerfile 如下

    1. FROM shenshuai/mynode:v1
    2. mkdir code

    基于shenshuai/mynode:v1创建新镜像,并且在新镜像中创建目录code。

    1. docker build -t newnode:v1 .

    注意:newnode文件命名必须全部小写。
    然后查看全部镜像docker images
    image.png
    使用newnode镜像生成一个容器,查看code目录是否存在。

    1. docker run -it 7f13197fd518 /bin/bash

    image.png
    Dockerfile可以有更多过程的,详情参考官网
    https://docs.docker.com/engine/reference/builder/

    删除容器 rm

    1. docker container rm [容器id]
    2. # 删除所有容器
    3. docker container rm $(docker container ps -a -q)

    基于Dockerfile创建镜像

  • Docker镜像是用一层一层的文件组成

  • docker inspect 命令可以查看镜像或容器
  • layers就是镜像的层文件,只能读,不能修改。基于镜像创建的容器会共享这些文件层。

Dockerfile 文件编写好以后,真正构建镜像时需要通过 docker build 命令。
docker build 命令用于使用 Dockerfile 创建镜像。

  1. # 使用当前目录的 Dockerfile 创建镜像
  2. docker build -t mycentos:7 .
  3. # 通过 -f Dockerfile 文件的位置创建镜像
  4. docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 .
  • -f:指定要使用的 Dockerfile 路径;
  • —tag, -t:镜像的名字及标签,可以在一次构建中为一个镜像设置多个标签。

    Dockerfile的基本结构:

  • 基础镜像信息

  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

为 Dockerfile 中的注释。
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。

编写Dockerfile

命令 含义 示例
FROM 基础镜像 FROM node
COPY 拷贝 COPY ./app /app
WORKDIR 指定工作路径 WORKDIR /app
RUN 编译打包镜像阶段运行命令 RUN npm install
EXPOSE 容器暴露端口 EXPOSE 3000
CMD 容器运行时,运行命令 CMD npm start
  1. FROM node
  2. COPY ./app /app
  3. WORKDIR /app
  4. RUN npm install
  5. EXPOSE 3000
  6. CMD npm start
  • FROM 表示新镜像继承的镜像
  • COPY 将当前目录下的app目录下的文件都拷贝到image里的/app目录中
  • WORKDIR 指定工作路径,类型cd命令
  • RUN npm install 在/app目录下安装依赖,安装后的依赖也会打包到镜像目录中,编译镜像时执行命令
  • EXPOSE 暴露3000端口,允许外部连接这个端口
  • CMD 启动容器时,执行的命令,只能有一个。如果在创建时传入了执行命令,会被覆盖

    FROM:指定基础镜像,必须为第一个命令

    1. 格式:
    2.   FROM <image>
    3.   FROM <image>:<tag>
    4.   FROM <image>@<digest>
    5. 示例:
    6.   FROM mysql:5.6
    7. 注:
    8.   tagdigest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

    MAINTAINER: 维护者信息

    1. 格式:
    2. MAINTAINER <name>
    3. 示例:
    4. MAINTAINER shenshuai89
    5. MAINTAINER shenshuai89@qq.com
    6. MAINTAINER shenshuai89 <shenshuai89@qq.com>

    RUN:构建镜像时执行的命令

    1. RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
    2. shell执行
    3. 格式:
    4. RUN <command>
    5. exec执行
    6. 格式:
    7. RUN ["executable", "param1", "param2"]
    8. 示例:
    9. RUN ["executable", "param1", "param2"]
    10. RUN apk update
    11. RUN ["/etc/execfile", "arg1", "arg1"]
    12. 注:
    13.   RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
    14. 可以在构建时指定--no-cache参数,如:docker build --no-cache

    ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

    1. 格式:
    2. ADD <src>... <dest>
    3. ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
    4. 示例:
    5. ADD hom* /mydir/ # 添加所有以"hom"开头的文件
    6. ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
    7. ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
    8. ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

    COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

    CMD:构建容器后调用,也就是在容器启动时才进行调用。

    1. 格式:
    2. CMD ["executable","param1","param2"] (执行可执行文件,优先)
    3. CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    4. CMD command param1 param2 (执行shell内部命令)
    5. 示例:
    6. CMD echo "This is a test." | wc -
    7. CMD ["/usr/bin/wc","--help"]
    8. 注:
    9.   CMD不同于RUNCMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

    ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。

    1. 格式:
    2. ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    3. ENTRYPOINT command param1 param2 (shell内部命令)
    4. 示例:
    5. FROM ubuntu
    6. ENTRYPOINT ["top", "-b"]
    7. CMD ["-c"]
    8. 注:
    9.    ENTRYPOINTCMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT
    10. docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT
    11. Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行
    12. 最后的ENTRYPOINT指令。

    LABEL:用于为镜像添加元数据

    1. 格式:
    2. LABEL <key>=<value> <key>=<value> <key>=<value> ...
    3. 示例:
    4.   LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
    5. 注:
    6.   使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间
    7. 通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

    ENV:设置环境变量

    1. 格式:
    2. ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    3. ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
    4. 示例:
    5. ENV myName John Doe
    6. ENV myDog Rex The Dog
    7. ENV myCat=fluffy

    EXPOSE:指定于外界交互的端口

    1. 格式:
    2. EXPOSE <port> [<port>...]
    3. 示例:
    4. EXPOSE 80 443
    5. EXPOSE 8080
    6. EXPOSE 11211/tcp 11211/udp
    7. 注:
    8.   EXPOSE并不会让容器的端口访问到主机。
    9. 要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,
    10. 或通过-P参数来发布EXPOSE导出的所有端口

    VOLUME:用于指定持久化目录

    1. 格式:
    2. VOLUME ["/path/to/dir"]
    3. 示例:
    4. VOLUME ["/data"]
    5. VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
    6. 注:
    7.   一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
    8. 1 卷可以容器间共享和重用
    9. 2 容器并不一定要和其它容器共享卷
    10. 3 修改卷后会立即生效
    11. 4 对卷的修改不会对镜像产生影响
    12. 5 卷会一直存在,直到没有任何容器在使用它

    WORKDIR:工作目录,类似于cd命令,目录不存在会自动创建

    1. 格式:
    2. WORKDIR /path/to/workdir
    3. 示例:
    4. WORKDIR /a (这时工作目录为/a)
    5. WORKDIR b (这时工作目录为/a/b)
    6. WORKDIR c (这时工作目录为/a/b/c)
    7. 注:
    8.   通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUNCMDENTRYPOINTADDCOPY等命令
    9. 都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

    ARG:用于指定传递给构建运行时的变量

    1. 格式:
    2. ARG <name>[=<default value>]
    3. 示例:
    4. ARG site
    5. ARG build_user=www

    ONBUILD:用于设置镜像触发器

    1. 格式:
    2.   ONBUILD [INSTRUCTION]
    3. 示例:
    4.   ONBUILD ADD . /app/src
    5.   ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    6. 注:
    7.   当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发

    Dockerfile创建示例

    ```dockerfile

    This my first nginx Dockerfile

    Version 1.0

Base images 基础镜像

FROM centos

MAINTAINER 维护者信息

MAINTAINER xxxx

ENV 设置环境变量

ENV PATH /usr/local/nginx/sbin:$PATH

ADD 文件放在当前目录下,拷过去会自动解压

ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/

RUN 执行以下命令

RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all RUN useradd -s /sbin/nologin -M www

WORKDIR 相当于cd

WORKDIR /usr/local/nginx-1.8.0

RUN ./configure —prefix=/usr/local/nginx —user=www —group=www —with-http_ssl_module —with-pcre && make && make install

RUN echo “daemon off;” >> /etc/nginx.conf

EXPOSE 映射端口

EXPOSE 80

CMD 运行以下命令

CMD [“nginx”]

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/737887/1637562244724-a9110038-8df0-4a8b-acb1-5312fde0d76f.png#clientId=u08d24fae-e70b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=294&id=u8c035bba&margin=%5Bobject%20Object%5D&name=image.png&originHeight=588&originWidth=1118&originalType=binary&ratio=1&rotation=0&showTitle=false&size=781359&status=done&style=none&taskId=u59a83972-cb36-4e00-add4-7e80275e348&title=&width=559)
  2. <a name="ZFqi4"></a>
  3. ### .dockerignore镜像忽略文件
  4. 表示排除的文件,不要打包到image镜像中
  5. ```bash
  6. .git
  7. node_modules

示例Express-demo

1.安装node

通过nvm安装node环境

  1. > apt-get update
  2. > apt-get install wget
  3. > wget -O- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
  4. > source /root/.bashrc
  5. > nvm install stable

2.安装express

  1. > npm install express-generator -g
  2. > express app

3.Dockerfile

  1. FROM node
  2. COPY ./app /app
  3. WORKDIR /app
  4. RUN npm install
  5. EXPOSE 3000
  6. CMD npm start

创建image

  1. docker build -t express-demo .
  • -t 用来指定image镜像的名称,后边可以加:tag指定标签,如果不知道默认就是latest
  • . 表示Dockerfile文件的所在的路径,即当前路径

    使用新镜像运行容器

    1. -> docker container run -p 3123:3000 -it express-demo /bin/bash
    2. -> npm start
  • -p 参数将容器的3000端口映射为本机的3123端口

  • -it 将容器的shell映射为当前shell,在本机容器执行的命令都会发送到容器中执行
  • express-demo image镜像名称
  • /bin/bash 容器启动后执行的第一个命令
  • —rm 在容器终止运行后,自动删除容器文件

volumes数据盘

使用docker容器,删除容器的时候,容器层里创建的文件也会被删除掉。如果想永久保存,比如web服务器日志,数据管理系统的数据,可以为容器创建数据盘。
数据盘用了将数据持久化到宿主机,与容器实现数据共享,简单的说就是将宿主机的目录映射到容器的目录,应用程序在容器中的目录读写数据会同步到宿主机上,让容器产生数据持久化。
image.png

  • volumes Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
  • 如果没有指定卷,则会自动创建
  • 建议使用—mount,更通用

    默认的volume挂载,默认文件存储位置

    创建数据卷

    1. docker volume create nginx-logger
    2. docker volume ls
    3. docker volume inspect nginx-logger

    挂载数据卷

    把nginx-html数据卷挂载到/usr/share/nginx/html,挂载后容器内的文件会同步到数据卷中

    1. docker run -d --name=nginxvolume --mount src=nginx-html,dst=/usr/share/nginx/html nginx
    1. docker run -d --name=nginxvolume -v nginx-html:/usr/share/nginx/html -p 3000:80 nginx
    1. docker run -d --name=nginxvolume -v /Users/shuai/Desktop/code/volume-data:/usr/share/nginx/html -p 3000:80 nginx

    删除数据卷

    1. docker container stop nginx1
    2. docker rm nginx1
    3. docker volume rm nginx-html

    Bind mounts模式,可以指定存放位置

  • 此方式与Linux系统的mount方式相似,会覆盖容器内已存在目录或文件,但并不会改变容器内原有的文件,当mount后容器内原有的文件就会还原

  • 创建容器可以通过-v或者 —volumn指定数据盘
  • bind mounts可以存储在宿主机系统的任意位置
  • 如果原文件或目录不存在,不会自动创建,会抛出错误
  • 如果挂载目录在容器中非空目录,则该目录现有内容将被隐藏

指定数据盘
-v 参数进行挂载

  1. docker run -v /Users/shuai/Desktop/code/volume-data:/mnt -it --name logs centos /bin/bash
  2. cd mnt
  3. echo 1 > 1.txt
  4. exit

image.png
然后查看宿主机的/Users/shuai/Desktop/code/volume-data目录下,会多出一个1.txt文件,文件内容正是在容器中添加的内容。

  1. docker inspect logs
  2. # 输出信息
  3. "Mounts": [
  4. {
  5. "Type": "bind",
  6. "Source": "/Users/shuai/Desktop/code/volume-data",
  7. "Destination": "/mnt",
  8. "Mode": "",
  9. "RW": true,
  10. "Propagation": "rprivate"
  11. }
  12. ]
  • Source:设置给容器使用的数据盘文件,在宿主机上的位置
  • Destination:数据盘在容器上的位置

创建数据盘容器
该容器不启动,只作为数据盘共享
docker create [options] imageName [command] [arg…] 创建一个容器,但是不启动
—volumes-from设置数据盘的容器

  1. docker create -v /mnt:/mnt --name logger centos
  2. docker run --volumes-from logger --name logger3 -i -t centos /bin/bash
  3. cd mnt
  4. touch logger3
  5. docker run --volumes-from logger --name logger4 -i -t centos /bin/bash
  6. cd mnt
  7. touch logger4

此时创建出来的logger3和logger4容器共享使用logger数据盘

网络

安装docker时,会创建三个网络,bridge(创建容器默认连接到此网络)、none、host。

  • None:该模式关闭容器的网络功能,对外界完全隔离
  • host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
  • bridge:此模式每个容器分配IP

可以使用—network 标志来指定容器应该连接到哪些网络

bridge桥接

  • bridge网络代表所有docker安装中存在的网络
  • 使用docker run —network= 选项指定,否则docker守护程序默认将容器连接到此网络
  • bridge模式使用 —net=bridge 指定。默认设置

    1. docker network ls #列出当前的网络
    2. docker inspect bridge # 查看当前的桥连网络
    3. docker run -d --name nginx1 nginx
    4. docker run -d --name nginx2 --link nginx1 nginx
    5. docker exec -it nginx2 bash
    6. apt update
    7. apt install -y inetutils-ping #安装ping工具
    8. apt install -y dnsutils
    9. apt install -y net-tools
    10. apt install -y iproute2
    11. apt install -y curl
    12. cat /etc/hosts
    13. ping nginx1

    在运行nginx2容器时,加上了—link参数,说明可以在nginx2容器中使用nginx1容器名称进行连接网络。
    其中原因是,/etc/hosts文件添加了关于nginx1的IP映射关系
    例如:nginxvolume nginxvolume1 nginxvolume2
    nginxvolume1创建时,没有关联nginxvolume,在容器nginxvolume1中ping nginxvolume,访问不通
    image.png
    在创建nginxvolume2时使用了—link nginxvolume。

    1. docker run -d --name nginxvolume2 --link nginxvolume1 nginx
    2. apt update
    3. apt install -y inetutils-ping
    4. ping nginxvolume1
    5. cat /etc/hosts

    image.png

    none模式

  • none模式使用—net=none指定

    1. # --net指定无网络
    2. docker run -d --name nginx_none --net none nginx
    3. docker inspect none
    4. docker exec -it nginx_none bash
    5. #该容器内部无法连接网络

    host模式

  • host模式使用—net=host指定

    1. docker run -d --name nginx-host --net host nginx
    2. docker inspect host

    端口映射

    1. # 查看镜像里暴露出的端口号
    2. docker image inspect nginx
    3. # 让宿主机8080端口映射到docker容器的80端口
    4. docker run -d --name port_nginx -p 8080:80 nginx
    5. # 查看主机绑定的端口
    6. docker container port port_nginx

    指向主机的随机端口

    ```bash docker run -d —name random_nginx —publish 80 bash docker port random_nginx

docker run -d —name randomall_nginx —publish-all bash docker run -d —name randomallP_nginx -P bash

  1. <a name="bCPxu"></a>
  2. ### 创建自定义网络
  3. - 可以创建出多个网络,每个网络IP范围均不相同
  4. - docker自定义网络里面有DNS服务,可以通过容器名称访问主机
  5. ```bash
  6. # 创建自定义网络
  7. docker network create --driver bridge mybridgeweb
  8. # 查看自定义网络的主机
  9. docker network inspect mybridgeweb
  10. # 创建容器时指定网络
  11. docker run -d --name myweb1 --net mybridgeweb nginx
  12. docker run -d --name myweb2 --net mybridgeweb nginx
  13. docker exec -it myweb2 bash
  14. ping myweb1

通过自定义桥连网络mybridgeweb,可以把myweb1和myweb2都关联到mybridgeweb,那么myweb1和myweb2就可以建立网络连接

连接到指定网络,创建容器之间网络互联

  1. docker run -d --name myconnectweb nginx
  2. # 给mybridgeweb容器添加myconnectweb网络连接。然后可以在mybridgeweb连接到myconnectweb
  3. docker network connect mybridgeweb myconnectweb
  4. docker network disconnect mybridgeweb myconnectweb

connect 【源网络】 【被连接网络】 //可以在源网络容器中连接到被连接网络

移除网络容器

  1. docker network rm mybridgeweb

compose编排

  • compose通过一个配置文件管理多个Docker容器
  • 在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本启动、停止、重启应用和应用中的服务以及所有依赖服务的容器
  • 步骤
    • 运行docker-compose up ,compose将启动并运行整个应用程序,配置文件组成
    • services定义需要的服务,每个服务有自己的名字、使用的镜像、挂载的数据卷所属的网络和依赖的其它服务
    • networks是应用的网络,在它下面可以定义使用的网络名称、类别
    • volumes是数据卷,可以在此定义数据卷,挂载到不同的服务上

      安装compose

      1. yarn add docker-compose

      编写docker-compose.yml

      1. version: "2"
      2. services:
      3. nginx1:
      4. image: nginx
      5. ports:
      6. - "8081:80"
      7. nginx2:
      8. image: nginx
      9. ports:
      10. - "8082:80"
      image.png

      docker-compose的命令

      | 命令 | 服务 | | —- | —- | | docker-compose up | 启动所有服务 | | docker-compose up -d | 后台启动所有服务 | | docker-compose up —build | 更改了配置文件后,重新启动编译 | | docker-compose ps | 查看通过compose启动的容器
      image.png | | docker-compose start | 启动服务 | | docker-compose stop | 停止所有服务 | | docker-compose down | 删除所有容器和网络 | | docker-compose logs -f | follow跟踪日志变化 | | docker-compose exec nginx1 bash | 进入nginx1服务系统 | | docker-compose rm nginx1 | 删除服务容器 | | docker-compose network ls | 查看网络 |

网络互ping

  1. docker-compose up -d
  2. docker-compose exec nginx1 bash
  3. apt update && apt install -y inetutils-ping
  4. ping nginx2

配置数据卷

创建webserver目录
.
├── backend
│ └── index.html
├── data
├── docker-compose.yml
└── front
└── index.html


docker-compose.yml

  1. version: "2"
  2. services:
  3. nginx1:
  4. image: nginx
  5. networks:
  6. - "mynginxweb"
  7. volumes:
  8. - "data:/data"
  9. - "./front:/usr/share/nginx/html"
  10. ports:
  11. - "8081:80"
  12. nginx2:
  13. image: nginx
  14. networks:
  15. - "default"
  16. volumes:
  17. - "data:/data"
  18. - "./backend:/usr/share/nginx/html"
  19. ports:
  20. - "8082:80"
  21. volumes:
  22. data:
  23. driver: local
  24. networks:
  25. mynginxweb:
  26. driver: bridge

front和backend目录下分别创建index.html,会将该文件映射到nginx的文件夹下。
启动docker-compose up -d
image.png
可以访问http://localhost:8081和http://localhost:8082,分别显示index下的文件内容。

Ubuntu系统安装docker

官方安装地址
https://docs.docker.com/engine/install/ubuntu/

在原版的Ubuntu系统安装

第一:Update the apt package

  1. sudo apt-get update
  2. sudo apt-get install \
  3. apt-transport-https \
  4. ca-certificates \
  5. curl \
  6. gnupg \
  7. lsb-release

第二:Add Docker’s official GPG key

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

第三: set up the stable repository

  1. echo \
  2. "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  3. $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

第四:Install Docker Engine

  1. sudo apt-get update
  2. sudo apt-get install docker-ce docker-ce-cli containerd.io

此步骤如果提示:Package ‘docker-ce’ has no installation candidate ,并且已经执行过apt-get update。
那么需要配置docker仓库地址

  1. #配置阿里云的gpg
  2. curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  3. #配置阿里云的docker镜像
  4. sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"<br>
  5. #执行安装命令
  6. sudo apt-get install docker-ce docker-ce-cli containerd.io

windows系统的子系统wsl【Ubuntu】上安装docker,

第一:windows 设置打开开发者

image.png
image.png
开启开发者选项

第二步:开启使用子系统模式

image.png
image.png
image.png

第三步:确定使用wsl2版本

https://docs.microsoft.com/zh-cn/windows/wsl/install-win10
按照官方说明进行设置。设置完成在powershell中查看版本
image.png

第四部:安装子系统打开 Microsoft Store

搜索wsl
image.png
安装ubuntu20.04.

第五部安装 Docker Desktop for Windows

下载地址:https://www.docker.com/products/docker-desktop
安装成功后打开 Expose daemon on tcp://localhost:2375 without TLS

image.png
第六部:Ubuntu安装成功后打开运行,设置用户名和密码

第七步:依次执行上面原版系统的安装命令

  1. $ sudo apt-get update
  2. $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  3. $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. $ sudo apt-key fingerprint 0EBFCD88
  5. $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  6. $ sudo apt-get update
  7. $ sudo apt-get install docker-ce
  8. $ export DOCKER_HOST=localhost:2375
  9. $ echo "export DOCKER_HOST=localhost:2375" >> ~/.bashrc

查看docker version时报错

Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon running?
解决办法:执行sudo -i进入root权限下,同时一定要确保docker-desktop打开的 Expose daemon on tcp://localhost:2375 without TLS。
另外还要关联上启动的wsl系统。
image.png
之后可以在root权限下,查看docker version
image.png

把docker-desktop-data移出系统盘

windows 系统最新的docker 都是安装Docker Desktop for Window桌面版
多次docker pull镜像后,会使得docker-desktop-data数据非常大,放在C盘会把系统盘占满。可以docker-desktop-data迁移出来
docker-desktop-data 默认存放位置 C:\Users\shenshuai\AppData\Local\Docker\wsl\data
docker-desktop 默认存放位置 C:\Users\shenshuai\AppData\Local\Docker\wsl\distro【比较小,可不迁移】

首先导出wsl子系统镜像

  1. wsl --export docker-desktop docker-desktop.tar //可选
  2. wsl --export docker-desktop-data docker-desktop-data.tar

删除现有的wsl子系统

  1. wsl --unregister docker-desktop //可选
  2. wsl --unregister docker-desktop-data

重新创建wsl子系统

  1. wsl --import docker-desktop D:\vmwork\docker\distro docker-desktop.tar
  2. wsl --import docker-desktop-data D:\vmwork\docker\data docker-desktop-data.tar

如果提示:已存在具有提供的名称的分发,多执行几次删除命令。然后再重试创建

docker配置镜像加速器

  1. 针对Docker客户端版本大于 1.10.0 的用户
  2. 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
  3. sudo mkdir -p /etc/docker
  4. sudo tee /etc/docker/daemon.json <<-'EOF'
  5. {
  6. "registry-mirrors": ["https://5biptv7a.mirror.aliyuncs.com"]
  7. }
  8. EOF
  9. # 重载所有修改过的配置文件
  10. sudo systemctl daemon-reload
  11. sudo systemctl restart docker

查看网络端口

使用docker本地安装nginx

  1. docker container run -d -p 4030:80 --rm --name mynginx nginx

image.png
执行成功后,可以在本地输入localhost:4030查看
image.png