镜像
容器
仓库
获取镜像
docker pull --help
运行镜像获得容器
docker run --help
列出镜像
docker image ls
虚悬镜像
docker image prune #删除虚悬镜像
中间层镜像
docker image ls -a #可以查看到
列出部分镜像
docker image ls [repo:tag]
列出镜像id
docker image ls -q
删除本地镜像
docker image rm --help #删除tag是本质
镜像运行容器定制
docker run --name webserver -d -p 81:80 nginx
//用nginx镜像启动一个容器命名为webserver,并映射80端口,用http://localhost:81可直接访问(-p 宿主机端口:容器端口)
//进入容器 docker exec -it webserver bash
//退出容器 exit
//查看容器变动 docker diff webserver
//保存容器修改到镜像(容器存储层数据存储)docker commit
定制镜像
docker commit --help
//保存容器修改到镜像(容器存储层数据存储修)
查看镜像历史
docker history [repo:tag]
启动容器
两种方式
新建并启动
docker run ubuntu:18.04 /bin/echo 'Hello world'
//命令输出一个 “Hello World”,之后终止容器。
docker run -t -i ubuntu:18.04 /bin/bash
//-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
//-i 则让容器的标准输入保持打开。
docker run的后台逻辑
启动已终止容器
docker container start
后台运行
#宿主机上输出
docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
#-d 后台运行,在docker logs中
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
终止容器
#查看容器
docker container ls -a
#终止运行中的容器
docker container stop
#终止状态容器重启
docker container start
#运行状态容器重启
docker container restart
进入容器
#attach方法
docker run -dit ubuntu
docker attach xxx //此时从stdin中exit,会导致容器停止。
#exec方法
docker run -dit ubuntu
docker exec -it 69d1 bash //从这个 stdin 中 exit,不会导致容器的停止
#更多方法
docker exec --help
导入导出容器
导出容器
#导出容器快照到本地文件
docker export 7691a814370e > ubuntu.tar
导入容器快照
#使用docker import 从容器快照文件中再导入为镜像
cat ubuntu.tar | docker import - test/ubuntu:v1.0
docker image ls
#也可以通过指定 URL 或者某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo
这两者的区别在于:
- 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态)
- 镜像存储文件将保存完整记录,体积也要大。
- 从容器快照文件导入时可以重新指定标签等元数据信息。
删除和清理容器
#删除一个处于终止状态的容器
docker container rm trusting_newton
#删除一个处于运行中的容器
docker container rm -f xxxx //docker会发送SIGKILL信号给容器。
#清理所有处于终止状态的容器
docker container prune
Docker Hub
Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像
常用命令
docker search //查找官方仓库中的镜像
docker pull //下载到本地
docker push //将自己的镜像推送到 Docker Hub
自动创建
自动创建(Automated Builds)功能对于需要经常升级镜像内程序来说,十分方 便。
私有仓库
容器中管理数据两种途径
数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的 被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷 。
常用操作
#创建一个数据卷 my-vol
docker volume create my-vol
#查看所有的 数据卷
docker volume ls
#在主机里使用以下命令可以查看指定 数据卷 的信息
docker volume inspect my-vol
#启动一个挂载数据卷的容器
#创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /webapp 目录。
docker run -d -P --name web --mount source=my-vol,target=/webapp \ training/webapp \
python app.pyc
在一次 docker run 中可以挂载多个 数据卷
#查看数据卷的具体信息
#主机里使用以下命令可以查看 web 容器的信息
docker inspect web //数据卷 信息在 "Mounts" Key 下面
#删除数据卷
docker volume rm my-vol
#清理数据卷
docker volume prune
- 数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷
- 并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷
- 如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令
挂载一个主机目录作为数据卷, --mount标记可以指定挂载一个本地主机的目录到容器中去
#加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录
docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
# read only只读
docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp,read
only \
training/webapp \
python app.py
#查看 web 容器的信息
docker inspect web
挂载一个本地主机文件作为数据卷
--mount 标记也可以从主机挂载单个文件到容器中
docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \
bash
#这样就可以记录在容器输入过的命令了
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
-P(大写)映射
#随机端口映射
docker run -d -P training/webapp python app.py
#查看映射关系
docker container ls -l
#查看应用信息
docker logs -f nostalgic_morse
-p(小写)映射
#映射所有接口地址
#hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口
docker run -d -p 5000:5000 training/webapp python app.py
#此时默认会绑定本地所有接口上的所有地址。
#映射到指定地址的指定端口
#ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如
localhost 地址 127.0.0.1
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
#映射到指定地址的任意端口
#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 pytho
n app.py
查看端口配置
使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
docker port nostalgic_morse 5000
查看容器内部网络配置
绑定多个端口
docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py
新建网络
docker network create -d bridge my-net
#-d 参数指定 Docker 网络类型有 bridge overlay
#其中 overlay 网络类型用于 Swarm mode
链接容器
#容器busybox1, 镜像源busybox, 网络my-net
docker run -it --rm --name busybox1 --network my-net busybox sh
#容器busybox2, 镜像源busybox, 网络my-net
docker run -it --rm --name busybox2 --network my-net busybox sh
#查看状态
docker container ls
#通讯验证,在busybox1中ping busybox2
ping busybox2
Docker Compose
如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。
配置容器的主机名和DNS,Docker 利用虚拟文件来挂载容器的 3 个相关配置文件来实现,在容器中执行mount可以获得相关挂载信息
$ mount
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
tmpfs on /etc/resolv.conf type tmpfs ...
#该机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 /etc/resolv.conf 文件立刻得到更新。
配置所有容器的DNS
可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
#每次启动的容器 DNS 自动配置为 114.114.114.114 和 8.8.8.8
#使用以下命令来证明其已经生效。
docker run -it --rm ubuntu:18.04 cat etc/resolv.conf
手动指定容器配置
可以在使用 docker run 命令启动容器时加入如下参数:
- 它会被写到容器内的 /etc/hostname 和 /etc/hosts 。
- 但它在容器外部看不到,既不会在docker container ls中显示,也不会在其他的容器的 /etc/hosts 看到。
- 让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
- 当设定搜索域为 .example.com时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索host.example.com 。
注意:如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的/etc/resolv.conf 来配置容器。