Docker 入门学习(3)
参考文献:《第一本Docker书》
1. 镜像管理基本操作
- 列出镜像
$ sudo docker images
本地镜像都包含在Docker宿主机的/var/lib/docker目录下。
- 拉取镜像
将镜像从Docker Hub下载到本地。
$ sudo docker pull ubuntu:16.04
拉取的Ubuntu并不是一个完整的操作系统,只是裁剪版,包含最低限度的支持系统运行的组件。
从其他仓库地址拉取:
$ sudo docker pull <registry>/<NAMES:TAG>
例如:$ sudo docker pull hub.c.163.com/public/ubuntu:16.04
- 查看镜像子命令
$ man docker-images
- 添加镜像标签
$ sudo docker tag ubuntu:latest wtt-ubuntu:latest
- 运行带标签的Docker镜像
$ sudo docker run -t -i --name wtt_1604 ubuntu:16.04 /bin/bash
- 查找镜像
查找所有Docker Hub上公共的可用镜像
$ sudo docker search centos
- 删除镜像
$ sudo docker rmi wtingting/static_web
- 删除所有镜像
$ sudo docker rmi 'docker images -a -q'
-f
(-force):强制删除镜像,即使有容器依赖它;
-no-prune
不要清理未带标签的父镜像。
更改docker镜像名:
$ sudo docker tag ubuntu/apache2 wtingting/apache2
- 清理镜像
$ sudo docker image prune -f
-a
删除所有无用镜像,不光是临时镜像;
-filter
只清理符合给定过滤器的镜像;
-f
强制删除镜像,而不进行提示确认。
2. 构建镜像
- 使用
docker commit
命令 - 本地导入
- 使用
docker build
命令和Dockerfile文件(推荐)
共享和发布镜像:创建Docker Hub账号
登录Docker Hub
$ sudo docker login
退出
$ sudo docker logout
-
使用
docker commit
创建镜像- 创建容器
$ sudo docker run -i -t ubuntu /bin/bash
- 安装Apache
root@.../# apt-get update ... root@.../# apt-get install apache2 ...
- 退出并提交容器
root@.../# exit $ sudo docker commit -m "message" -a "author" <容器ID> 目标镜像仓库/镜像名 如: $ sudo docker commit aec06924a464 ubuntu/apache2
- 检查新创建的镜像
$ sudo docker images 目标镜像仓库/镜像名
或者
查看提交镜像的详细信息
$ sudo docker inspect 目标镜像仓库/镜像名
- 从刚创建的新镜像运行一个容器
$ sudo docker run -t -i 目标镜像仓库/镜像名 /bin/bash
-
本地导入
下载了ubuntu-16.04的模板压缩包后,使用如下命令导入:
$ cat ubuntu-16.04-x86_44-minimal.tar.gz | docker import -ubuntu:16.04
- Dockerfile定义文件
- 创建示例仓库:
$ mkdir web
$ cd web
$ touch Dockerfile
- 编写Dockerfile
DSL(Domain Specific Language)语法。
# version:0.0.1
FROM ubuntu:16.04
MAINTAINER wtt "wtingting@example.com"
RUN apt-get update && apt-get install nginx
RUN echo 'Hi,I am a comtainer'\
>/usr/share/nginx/html/index.html
EXPOSE 80
指令大写,如FROM;后面跟随参数;
Dockerfile指令按从上到下执行。
每个Dockerfile的第一条指令必须是FROM,FROM指定一个基础镜像;
MAINTAINER 指定作者姓名及邮件;
RUN 运行指定的命令;
EXPOSE 指定向外部公开端口。
- 构建新镜像
- 运行Dockerfile
$ cd web
$ sudo docker build -t="ubuntu/static_web:v0.1" .
-t=仓库/名称:标签
;
.
指定本地目录;也可以指定其他目录,具体方式为:
$ sudo docker build -t="ubuntu/static_web" -f path/to/file
-f
指定一个区别于标准Dockerfile的构建源的位置。
3. Dockerfile构建缓存
- 忽略Dockerfile的构建缓存
$ sudo docker build --no-cache -t="ubuntu/static_web" .
--no-cache
表示忽略缓存。
- 构建缓存
Ubuntu系统Dockerfile模板
FROM ubuntu:16.04
MAINTAINER wtt "wtingting@example.com"
ENV REFRESHED_AT 2020-2-10
RUN apt-get update
ENV
设置环境变量。
- 查看镜像
$ sudo docker images ubuntu/static_web
- 查看镜像历史
$ sudo docker history <镜像ID/NAMES>
查看镜像的每一层,以及指令。
- 从新镜像启动容器
$ sudo docker run -d -p 80 --name static_web ubuntu/static_web nginx -g "daemon off;" <长ID>
- 查看端口映射
$ sudo docker ps -l
或者
$ sudo docker port <容器ID/NAMES> 端口
- 指定特定端口
$ sudo docker run -d -p 80:8080 --name static_web ubuntu/static_web \
nginx -g "daemon off;"
将容器内的80端口绑定到本地宿主机8080端口上。
-p 127.0.0.1:80:80
将容器内的80端口绑定到本地宿主机的127.0.0.1这个IP的80端口。
-P
将容器80端口对本地宿主机公开。
4. 推送镜像至Docker Hub
先注册Docker Hub;
在命令行使用docker login
登录;登录信息记录在本地~/.docker目录下;
镜像标签前缀必须为用户名。
- 推送root镜像
$ sudo docker push wtingting/static_web
在命令行使用docker logout
登出。
5. Docker迁移
- 导出镜像
$ sudo docker save wtingting/apache2 > test_image.tar
或者
$ sudo docker save -o test_image.tar wtingting/apache2
之后拷贝镜像文件到待迁移的系统。
- 开启待迁移系统Docker
$ sudo systemctl restart docker
- 导入镜像
$ sudo docker load < test_image.tar
或者
$ sudo docker --i test_image.tar
- 运行镜像
$ sudo docker run -it --name <新建容器名> <导入的镜像名>