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、网络模式