计算机网络/计算机科学与应用/系统/运维/开发

12.23 Docker

Docker 

Go语言实现的开源容器项目 ,发起者是dotCloud公司 ,1 Docker官方网站

优势:快速的交付和部署,高效的资源利用,轻松的迁移和扩展,简单的更新管理

Docker 与 虚拟机的比较:

Docker容器快 秒级实现启动

Docker容器对系统资源需求很少,一台主机上可以运行数千个Docker容器

Docker Git设计方便用户获取 分发 更新镜像

Docker 通过Dockerfile 支持灵活的自动化创建和部署机制 标准化流程

Docker 核心概念 

镜像Image 容器Container  仓库Repository 

Docker镜像

类似于虚拟机镜像,理解为一个只读模版

镜像是创建Docker容器的基础

Docker容器 

容器是从镜像创建的应用运行实例,可以启动、开始、停止、删除 容器 

镜像是只读的,容器从镜像启动时候,会在镜像最上层创建一个可写层

Docker仓库 

2个概念,Docker仓库和仓库注册服务器 

仓库注册服务器是存放仓库的地方,可以有多个仓库

每个仓库存放多个镜像,不同的标签tag进行区分不同镜像 

Docker 仓库可以分为公开仓库public 和 私有仓库 private两种形式 

也可以创建在本地网络内创建一个只能自己访问的私有仓库,通过push指令上传

安装Docker引擎

Ubuntu环境下安装Docker 

Centos环境下安装Docker 

https://docs.docker.com/engine/install/centos/

1、添加软件源,支持devicemapper存储类型

        $ sudo yum update

        $ sudo yum install -y yum-utils \

            device-mapper-persistent-data \

            lvm2

2、添加Docker稳定版yum源

        $ sudo yum-config-manager \

              --add-repo \

              https://download.docker.com/linux/centos/docker-ce.repo

3、更新yum软件源缓存 安装Docker 

        $ sudo yum update

        $ sudo yum install -y docker-ce

4、确认Docker服务启动

systemctl  start docker 

5、查看docker版本信息

docker version 

启动一个Nginx容器,查看镜像运行:

docker run -d -p 80:80 --name webserver nginx 

查看docker运行状态

docker ps 

Docker镜像

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker会先从默认镜像

仓库下载,默认使用Docker Hub公共注册服务器中 的仓库,用户也可以通过配置,使用自定义镜像仓库 

1、获取镜像 

镜像是运行容器的前提 

获取镜像命令  docker [image] pull 命令从 docker hub下载镜像 

格式: docker [image] pull NAME[:TAG]

NAME是镜像仓库名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)

实例,获取一个Ubuntu 18.04 系统的基础镜像

$ docker pull ubuntu:18.04

不指定tag,默认下载最新版latest标签

docker pull ubuntu:18.04 相当于 docker pull registry.hub.docker.com/ubuntu:18.04

从默认的注册服务器Docker Hub Registry中的ubuntu仓库来下载标记为18.04的镜像

从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址

$ docker pull hub.c.163.com/public/ubuntu:18.04

2、查看镜像信息 

2.1、使用images 命令列出镜像

docker images 或 docker image ls 列出本地主机上已有的镜像基本信息 

[root@localhost ~]# docker image ls

REPOSITORY            TAG       IMAGE ID       CREATED         SIZE

myubuntu              v1        761ecda3a468   13 days ago     604MB

test                  0.1       203fa34f877d   4 weeks ago     63.2MB

zth/test              0.1       203fa34f877d   4 weeks ago     63.2MB

mysql                 latest    10db11fef9ce   2 months ago    602MB

REPOSITORY 来自仓库

TAG 镜像标签信息

IMAGE ID 镜像ID 

CREATED 创建时间 

SIZE 镜像大小 

帮助手册 man docker-images 

OPTIONS

       -a, --all[=false]      列出所有(包括临时文件)镜像文件,默认为否

       --digests[=false]      列出镜像的数字摘要值,默认为否;

       -f, --filter=      过滤列出的镜像,如dangling=true只显示没有被使用的镜像;也可指定带有特定标注的镜像等;

       --format=""       控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等;

       -h, --help[=false]      help for images

       --no-trunc[=false]      对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是;

       -q, --quiet[=false]      仅输出ID信息,默认为否

  

2.2、使用tag命令添加镜像标签

实例,添加一个新的myubuntu:latest镜像标签 

$ docker tag ubuntu:latest myubuntu:latest 

myubuntu:latest类似于 ubuntu:latest的别名

2.3、使用inspect命令查看详细信息

docker [image] inspect 命令可以获取镜像详细信息

[root@localhost ~]# docker image inspect mysql

[

{

"Id": "sha256:10db11fef9ce975df1539448189656f9e3251b7984130c7a86e1b348bf298a89",

"RepoTags": [

"mysql:latest"

],

"RepoDigests": [

"mysql@sha256:2be51594eba5983f47e67ff5cb87d666a223e309c6c64450f30b5c59a788ea40"

],

"Parent": "",

"Comment": "buildkit.dockerfile.v0",

"Created": "2024-10-14T22:24:51Z",

"DockerVersion": "",

"Author": "",

"Config": {

查看某项信息 -f 选项:

$ docker [image] inspect -f {{".Architecture"}} ubuntu:18.04

2.4、使用history 命令查看镜像历史

[root@localhost ~]# docker history 761

IMAGE          CREATED        CREATED BY                                       SIZE      COMMENT

761ecda3a468   13 days ago    RUN /bin/sh -c apt-get install -y python3 # …   10.5kB    buildkit.dockerfile.v0

<missing>      13 days ago    RUN /bin/sh -c apt-get install -y build-esse…   56.1MB    buildkit.dockerfile.v0

<missing>      13 days ago    RUN /bin/sh -c apt-get install -y   cmake gi…   413MB     buildkit.dockerfile.v0

<missing>      13 days ago    RUN /bin/sh -c apt-get -y upgrade # buildkit     0B        buildkit.dockerfile.v0

<missing>      13 days ago    RUN /bin/sh -c apt-get -y update # buildkit      57.4MB    buildkit.dockerfile.v0

<missing>      3 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]             0B        

<missing>      3 months ago   /bin/sh -c #(nop) ADD file:ebe009f86035c175b…   77.9MB    

<missing>      3 months ago   /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B        

<missing>      3 months ago   /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B        

<missing>      3 months ago   /bin/sh -c #(nop)  ARG LAUNCHPAD_BUILD_ARCH      0B        

<missing>      3 months ago   /bin/sh -c #(nop)  ARG RELEASE                   0B        

3、搜索镜像 

docker search [option] keyword 

https://docs.docker.com/reference/cli/docker/search/

选项: 

-f, --filter 过滤输出内容

--format 格式化输出内容

--limit 限制输出结果个数,默认为25个

--no-trunc 不截断输出结果

实例,搜索带nginx关键字的镜像 

$ docker search --filter=stars=3 --no-trunc nginx 

4、删除和清理镜像 

4.1、使用标签删除镜像 

docker rmi 或 docker image rm命令可以删除镜像

格式: docker rimi IMAGE[IMAGE...]

IMAGE,为标签或ID 

选项:

-f, -force:强制删除镜像,即使有容器依赖它

-no-prune:不要清理未带标签的父镜像

实例,删除myubuntu:latest镜像 

$ docker rmi myubuntu:latest

同一个镜像拥有多个标签时,docker rmi命令只是删除了该镜像多个标签中指定标签而已

不影响镜像文件

4.2、使用镜像ID删除镜像 

当镜像创建的容器存在时,镜像文件默认是无法被删除的  

[root@localhost ~]# docker ps -a

查看所有存在的容器

如果要删除正在运行的容器,可以使用 -f 参数 

$ docker rmi -f ubuntu:18.04

通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像

正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像

先删除容器:

$ docker rm 容器ID

再删除镜像:

$ docker rmi 镜像id 

4.3、清理镜像 

使用 docker 清理没有被使用的镜像 

docker image prune 命令 

-a, -all:删除所有无用镜像,不光是临时镜像

-filter filter:只清理符合给定过滤器的镜像

-f, -force:强制删除镜像,而不进行提示确认

实例,自动清理临时的遗留镜像文件层,最后会提示释放的存储空间 

[root@localhost ~]# docker image prune -f

Total reclaimed space: 0B

5、创建镜像 

5.1、基于已有容器创建镜像 

dodcker [container] commit 命令 

格式: docker [container] commit [OPTIONS] CONTAINER [REPOSITORY [:TAG]]

选项: 

-a, --author 作者信息

-c, --change 提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|E NV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等

-m, --message 提交消息

-p, --pause true 提交时暂停容器运行

docker container commit -m "Added a new file" -a "Docker Newbee" a952cb40... test:0.1 

5.2、基于本地模版导入镜像 

docker [image] import [OPTIONS] file | URL | - [REPOSITORY [:TAG]]

5.3、基于Dockerfile创建 

FROM debian:stretch-slim

        LABEL version="1.0" maintainer="docker user <docker_user@github>"

        RUN apt-get update && \

            apt-get install -y python3 && \

            apt-get clean && \

            rm -rf /var/lib/apt/lists/*

$ docker image build -t python:3 

$ docker images | grep python 

6、存出和载入镜像

6.1、存出镜像

导出镜像到本地文件 docker [image] save 

选项: 

-o 

-output 

$ docker save -o ubuntu_18.04.tar ubuntu:18.04 

6.2、载入镜像

docker [image] load 将导出的tar文件再导入到本地镜像

选项: 

-i, --input Read from tar archive file, instead of STDIN

-q, --quiet Suppress the load output

实例,从文件ubuntu_18.04.tar导入镜像到本地镜像列表 

$ docker load -i ubuntu_18.04.tar 

或者 

$ docker load < ubuntu_18.04.tar 

7、上传镜像 

默认上传到Docker Hub官方仓库,需要登录

docker [image] push NAME[:TAG] | [REGISTRY_HOST [:REGISTRY_PORT]/] NAME[:TAG]

实例,上传本地镜像,先添加新的标签,在上传镜像

$ docker tag test:latest user/test:latest 

$ docker push user/test:latest 

第一次上传时,登录信息~/.docker保存在文件中。

8、创建容器 

8.1、新建容器

docker [container] create 命令 

实例,创建一个 容器 

$ docker create -it ubuntu:latest 

该命令创建的容器处于停止状态,使用 docker [container] start 命令启动

https://docs.docker.com/reference/cli/docker/container/create/

8.2、启动容器

docker [container] start 命令启动一个已经创建的容器

$ docker start af...

8.3、新建并启动容器

docker  [container] run 命令 

等价 先执行 docker [container] create命令 

再执行 docker [container] start命令

实例,启动一个 hello world 容器

$ docker run ubuntu /bin/echo 'Hello world'

执行流程:

检查本地是否存在指定的镜像,不存在就从公共仓库下载

利用镜像创建一个容器,并启动该容器

分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层

从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

从网桥的地址池配置一个IP地址给容器

执行用户指定的应用程序

执行完毕后容器被自动终止

实例,启动一个bash终端,交互模式

$ docker run -it ubuntu:18.04 /bin/bash 

-i 让容器标准输入保持打开

-t 分配一个伪终端绑定到容器的标准输入上

docker container wait CONTAINER 命令等待容器退出,并打印退出返回结果

[root@localhost ~]# docker container wait 2eb

0

8.4、守护态运行

-d参数 让Docker容器在后台以守护态(Daemonized)形式运行

[root@localhost ~]# docker run -d ubuntu /bin/sh -c "while true;echo hello world;sleep 1; done"

8.5、查看容器输出

docker [container] logs命令 获取容器的输出信息

选项: 

-details:打印详细信息

-f, -follow:持续保持输出

-since string:输出从某个时间开始的日志

-tail string:输出最近的若干日志

-t, -timestamps:显示时间戳信息

-until string:输出某个时间之前的日志

实例,查看容器的输出信息

[root@localhost ~]# docker logs 2eb9f

9、停止容器

9.1、暂停容器

docker [container] pause CONTAINER [CONTAINER...] 暂停一个运行中的容器

[root@localhost ~]# docker pause df2c7

df2c7

[root@localhost ~]# docker container ps

CONTAINER ID   IMAGE          COMMAND                   CREATED       STATUS                PORTS                                                  NAMES

df2c7de2d355   mysql:8.0.20   "docker-entrypoint.s…"   2 weeks ago   Up 5 hours (Paused)   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mysql8

将paused状态的容器恢复运行状态

[root@localhost ~]# docker container unpause df2c7

df2c7

9.2、终止容器

docker [container] stop 终止运行中的容器

格式: docker [container] stop [-t|--time [=10]] [CONTAINER...]

还能使用 docker [container] kill 直接发送SIGKILL信号强制终止容器

查看所有容器ID 

[root@localhost ~]# docker ps -qa

f4197426f980

2eb9f7312cda

905fddc48eae

处于终止状态的容器,通过docker [container] start 命令重新启动

$ docker start f4197426f980

重启容器

$ docker [container] restart

10、进入容器

之前 使用过 -d 参数 后台运行,无法看到容器信息

10.1、使用attach命令进入容器 

格式: 

docker [container]  attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER 

选项: 

--detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q

--no-stdin=true|false:是否关闭标准输入,默认是保持打开

--sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true

$ docker run -it -d ubuntu 

10.2、 exec命令

可以在运行中容器内直接执行任意命令

docker [container]  exec  [-d|--detach]  [--detach-keys[=[]]]  [-i|--interactive]

            [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]

实例,进入到刚创建的容器中,并启动一个bash 

$ docker exec -it 243c32535da7   /bin/bash

-d, --detach:在容器中后台执行命令

--detach-keys="":指定将容器切回后台的按键

-e, --env=[]:指定环境变量列表

-i, --interactive=true|false:打开标准输入接受用户输入命令,默认值为false

--privileged=true|false:是否给执行命令以高权限,默认值为false

-t, --tty=true|false:分配伪终端,默认值为false

-u, --user="":执行命令的用户名或ID

11、删除容器

docker [container] rm 命令删除处于终止或退出状态的容器

格式: 

docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]

-f, --force=false:是否强行终止并删除一个运行中的容器

-l, --link=false:删除容器的连接,但保留容器

-v, --volumes=false:删除容器挂载的数据卷

-f 参数 直接删除一个运行中的容器

# docker rm -f 2ae 

12、导入和导出容器

12.1、导出容器 

导出一个已经创建的容器到一个文件,不管容器是否处于运行状态

docker [container] export [-o|--output[=""]] CONTAINER 

-o 指定导出tar文件名 也可以 重定向实现 

实例,导出ce55容器和e812容器到文件 test_for_run.tar文件 和  test_for_stop.tar文件

$ docker export -o test_for_run.tar ce5 

$ docker export e81 > test_for_stop.tar 

导出后,可将tar文件传输到其他机器,通过导入命令导入到系统中 实现容器迁移 

12.2、导入容器 

导出的文件可以 docker [container] import 导入变成镜像

格式:docker  import  [-c|--change[=[]]]  [-m|--message[=MESSAGE]]  file|URL|- [REPOSITORY[:TAG]]

-c, --change=[] :导入的同时执行对容器进行修改的Dockerfile指令

-m, --message: 为导入的镜像添加注释

https://www.runoob.com/docker/docker-import-command.html

实例,导入到系统

$ docker import test_for_run.tar - test/ubuntu:v1.0

docker load命令导入镜像存储文件到本地镜像库,docker [container] import命令来导入一个容器快照到本地镜像库

区别:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态)

而镜像存储文件将保存完整记录,体积更大,从容器快照文件导入时可以重新指定标签等元数据信息

13、查看容器 

13.1、查看容器详情 

格式:docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

实例,查看容器的信息

$ docker container inspect 容器id

13.2、查看容器内进程 

$ docker [container]  top [OPTIONS] CONTAINER [CONTAINER...]

$ docker top 容器id  

13.3、查看统计信息 

$ docker [container] stats [OPTIONS] [CONTAINER...]

选项: 

-a, -all:输出所有容器统计信息,默认仅在运行中

-format string:格式化输出信息

-no-stream:不持续输出,默认会自动更新持续实时结果

-no-trunc:不截断输出信息

13.4、复制文件 

container cp命令支持在容器和主机之间复制文件

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

SRC_PATH: 源路径(可以是容器内的路径或宿主机的路径)

CONTAINER: 容器的名称或 ID

DEST_PATH: 目标路径(可以是容器内的路径或宿主机的路径)

实例,将本地的路径data复制到test容器的/tmp路径下 

$ docker [container] cp data test:/tmp/ 

https://www.runoob.com/docker/docker-cp-command.html

13.5、查看变更 

显示 Docker 容器文件系统的变更

https://www.runoob.com/docker/docker-diff-command.html

格式:docker diff CONTAINER

13.6、查看端口映射

查看容器的端口映射情况

格式: docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

CONTAINER: 要查询端口映射的容器的名称或 ID

PRIVATE_PORT (可选): 容器内部的端口号

PROTO (可选): 协议类型(tcp 或 udp),默认是 tcp

$ docker container port 容器id 

13.7、更新配置 

docker [container] update [OPTIONS] CONTAINER [CONTAINER...]

实例,自动重启,则开机就会自动运行

docker container update --restart=always [container_id]

实例,开机不自动重启

docker container update --restart=always  [container_id]

非正常退出后,自动重启,最多重启次数

docker container update --restart=on-failure:3 [container_id]

no,默认策略,在容器退出时不重启容器

on-failure,在容器非正常退出时(退出状态非0),才会重启容器

on-failure:3,在容器非正常退出时重启容器,最多重启3次

always,在容器退出时总是重启容器

unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

实例,限制总配额为1秒,容器test所占用时间为10% 

$ docker update --cpu-quota 1000000 test

        test

$ docker update --cpu-period 100000 test

        test

14、Docker仓库 

14.1、Docker Hub公共镜像市场

https://hub.docker.com

登录:

通过命令行执行docker login命令来输入用户名、密码和邮箱来完成注册和登录

本地用户目录下会自动创建.docker/config.json文件

操作:

docker [image] pull命令下载镜像

14.2、第三方镜像市场

腾讯云、网易云、阿里云

15、搭建本地私有仓库

15.1、使用registry镜像创建私有仓库

参考:https://www.cnblogs.com/Chary/p/18095027 

下载搭建一个本地私有仓库

$ docker pull registry 

运行私有库Registry 相当于本地有个私有Docker Hub 

run该镜像,构建一个本地私有服务器容器,并将本地镜像发送上去

$ docker run -d -p 5000:5000 -v /liang/my_registry/:/tmp/registry --privileged=true registry

仓库创建在容器的/var/lib/registry目录下,也就是说每次我们上传到registry的私人服务器仓库的文件就存储到/var/lib/registry目录下。

考虑到权限管理问题,在实际应用中通常需要自定义容器卷映射

-d 设置Reigistry容器后台运行模式

-p 网络端口映射 指定容器端口绑定到主机相应主机端口

默认情况下Docker开放了5000端口(Python Flask端口)映射到主机端口32769上,

这里的-p 5000:5000是将Docker内部默认端口映射到主机端口5000上,第一个5000是主机端口;第二5000是容器端口。

-v 添加数据卷,格式为:-v /宿主机目录:/容器内目录。需要注意的是,指令执行后会自动创建文件夹

--privileged=true:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied的解决办法

registry:docker registry镜像

注意: 

    上面的指令-p 5000:5000端口,并没有指定端口的绑定网络地址,这时候系统会默认主机的绑定网络地址为0.0.0.0。

也就是说,我们访问主机上私有仓库Registry时候需要通过网络地址0.0.0.0

16、Docker数据管理

16.1、数据卷

给容器使用的目录,将主机操作系统目录直接映射到容器,类似 mount 挂载 

数据卷特性:

数据卷可以在容器之间共享和重用

对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作

对数据卷的更新不会影响镜像,解耦开应用和数据

卷会一直存在,直到没有容器使用,可以安全地卸载它

创建数据卷:

volume管理数据卷

语法:docker volume create -d local my_volume

实例,创建一个新卷

$ docker volume create -d local my_volume 

--driver: 指定卷驱动程序(默认为 local

--label: 为卷添加标签

-o, --opt: 为卷指定驱动程序选项

/var/lib/docker/volumes路径下,能查看到数据卷位置

实例,创建一个新卷

docker volume create --name my_volume --label project=my_project

16.2、绑定数据卷

创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种创建形式称为绑定数据卷

方式:在docker [container] run 命令的时候,使用--mount选项使用数据卷

--mount 支持三种类型的数据卷

volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下

bind:绑定数据卷,映射到主机指定路径下

tmpfs:临时数据卷,只存在于内存中

实例,training/webapp镜像创建一个Web容器,并创建一个数据卷挂载到容器的/opt/webapp目录

$ docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py 

本地目录的路径必须是绝对路径,容器内路径可以为相对路径。如果目录不存在,Docker会自动创建

Docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读

docker run -d -P --name web -v /webapp:/opt/webapp:ro  training/webapp python app.py 

加:ro 后,容器内对所挂载数据卷内的数据就无法修改

16.3、数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载

16.4、 利用数据卷容器来迁移数据

作用:备份、迁移、恢复数据

创建一个数据卷容器dbdata,并创建一个数据卷挂载到/dbdata 

docker run -it -v /dbdata --name dbdata ubuntu:18.04

在其他容器中使用 --volumes-form挂载dbdata容器中的数据卷 

创建db1和db2两个容器,并从dbdata容器挂载数据卷

docker run -it --volumes-form dbdata --name db1 ubuntu:18.04

docker run -it --volumes-form dbdata --name db2 ubuntu:18.04

此时,三个容器任何一方在该目录下写入数据,其他都可以访问

17、端口映射与容器互联

17.1、端口映射实现容器访问

从外部访问容器应用:

启动容器时,如果不指定对应参数,在容器外无法通过网络访问容器内的应用和服务

使用-P 或 -p 参数指定端口映射 ,-P(大写) 随机映射一个49000~49900端口到内部容器开放的网络端口

-p(小写) 指定映射端口,在一个指定端口上只可以绑定一个容器

IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort

17.2、映射所有接口地址

HostPort:ContainerPort格式本地的5000端口映射到容器的5000端口

$ docker run -d -p 5000:5000 training/webapp python app.py 

多次使用-p标记可以绑定多个端口

$ docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py 

17.3、映射到指定地址的指定端口

IP:HostPort:ContainerPort格式指定映射使用一个特定地址,比如localhost地址127.0.0.1:

$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

17.4、映射到指定地址的任意端口

IP::ContainerPort绑定localhost的任意端口到容器的5000端口,本地主机会自动分配一个端口

$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

使用udp标记来指定udp端口:

$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

17.5、查看映射端口配置

docker port 查看当前映射的端口配置,也可以查看到绑定的地址

docker port 显示容器的端口映射信息,即容器内部的端口如何映射到宿主机的端口

docker port 对了解容器如何与宿主机网络交互非常有用

格式:docker port CONTAINER docker port

CONTAINER: 要查询端口映射的容器的名称或 ID

PRIVATE_PORT (可选): 容器内部的端口号

PROTO (可选): 协议类型(tcp 或 udp),默认是 tcp

查看容器特定的端口

$ docker port 容器名 端口号 

示名为 my_container 的容器内部的端口 80 映射到宿主机的哪个端口

$ docker port my_container 80  

查看容器的所有端口映射

docker port my_container

查看特定端口和协议的映射:

docker port my_container 80/tcp 

提示:容器有自己的内部网络和IP地址,使用docker [container] inspect +容器ID可以获取容器的具体信息

实例,启动一个容器并映射端口

docker run -d -p 8080:80 --name my_container nginx

my_container 容器的端口 80 映射到宿主机的端口 8080

查看端口映射:

docker port my_container

80/tcp -> 0.0.0.0:8080

显示容器的端口 80 映射到宿主机的 8080 端口

查看特定端口映射:

docker port my_container 80 

输出:

0.0.0.0:8080

注意:

如果容器没有暴露任何端口,或者没有进行端口映射,docker port 命令将不会返回任何信息

docker port 命令仅显示端口映射信息,不会显示容器内部运行的服务的状态或其他信息

17.6、互联机制实现便捷互访

容器的互联(linking)是一种让多个容器中的应用进行快速交互的方式。

它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址

自定义容器命名:

连接系统依据容器的名称来执行,系统会默认分配一个名字,自定义命名容器有2个好处:

自定义的命名,比较好记,比如一个Web应用容器我们可以给它起名叫web,一目了然

当要连接其他容器时候(即便重启),也可以使用容器名而不用改变,比如连接web容器到db容器

使用--name标记可以为容器自定义命名:

$ docker run -d -P --name web training/webapp python app.py

$ docker ps -l 

使用docker [container] inspect来查看容器的名字

$ docker [container] inspect -f "{{ .Name }}" aed84ee21bde

注意:

容器的名称是唯一的。

如果已经命名了一个叫web的容器,当你要再次使用web这个名称的时候,

需要先用docker rm命令删除之前创建的同名容器

在执行docker [container] run的时候如果添加--rm标记,则容器在终止后会立刻删除。

注意,--rm和-d参数不能同时使用

容器互联:

【已弃用】使用--link参数可以让容器之间安全地进行交互

18、Dockerfile创建镜像 

18.1、基本结构 

Dockerfile 由一行行命令组成,支持 # 开头注释 

主体内容分为4部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

19、操作系统

20、为镜像添加SSH服务

ubuntu系统安装 netstat 

apt update 

apt install net-tools 

21、Web服务与应用

21.1、构建Apache

[root@localhost docker]# vim Dockerfile

FROM httpd:2.4

COPY ./public-html /usr/local/apache2/htdocs/

[root@localhost docker]# mkdir public-html

 

创建index.html 

<! DOCTYPE html>

<html>

<body>

<p>Hello, Docker! </p>

</body>

</html>

构建镜像:

$ docker build -t apache2-image .

    查看镜像:

[root@localhost docker]# docker images

REPOSITORY            TAG       IMAGE ID       CREATED         SIZE

apache2-image         latest    02f9f32dcae0   3 minutes ago   147MB

启动容器:

[root@localhost docker]# docker run -d -p 80:80 apache2-image

1c25fce7ce33df10ff885f51f6a786857c0679db81aa213b2e15c55797ed0b7c

浏览器访问端口即可。

直接通过映射目录方式运行Apache容器

$ docker  run  -it  --rm  --name  my-apache-app  -p  80:80  -v  "$PWD":/usr/local/apache2/

              htdocs/httpd:2.4

21.2、Nginx 

$ docker run -d -p 80:80  --name webserver nginx 

使用dockerfile 构建 

vim Dockerfile 

FROM nginx 

COPY ./index.html /usr/share/nginx/html 

构建my-nginx 

$ docker build -t my-nginx .

执行指令

docker run --name nginx-container -d my-nginx 

22、数据库应用 

       

23、网络模式 


无才无以立足,不苦不能成才。

评论

^