Docker 是一个容器工具, 提供虚拟环境. 解决了软件的环境配置和依赖问题, 让软件可以带环境和依赖的安装.
Docker 将应用程序与该程序的依赖, 打包在一个文件里面. 运行这个文件, 就会生成一个虚拟容器. 程序在这个虚拟容器里运行, 就好像在真实的物理机上运行一样. 有了 Docker, 就不用担心环境问题.
1. 注册 docker 账号
想要使用 docker, 先注册一个 docker 账号, 注册 docker 账号 https://hub.docker.com/signup .
注册完成后, 登录到 docker hub https://hub.docker.com/ 就能看到自己的 docker 镜像了, docker hub 是 docker 官方存放 docker 镜像的仓库. 如我的 hub 下列出了我 push 的镜像
2. docker 的安装
注册完 docker 账号, 然后安装 docker:
- Windows 10
- Mac OS https://docs.docker.com/docker-for-mac/install/
Windows 10 安装 docker 19.03.2 百度网盘地址 https://pan.baidu.com/s/12gRfPQFjpsKj6VEodXgJvg
安装完成后可以通过命令 docker version 来查看 docker 的版本号
- C:\Users\lixinjie>docker version
- Client: Docker Engine - Community
- Version: 19.03.2
- API version: 1.40
- Go version: go1.12.8
- Git commit: 6a30dfc
- Built: Thu Aug 29 05:26:49 2019
- OS/Arch: Windows/amd64
- Experimental: false
- Server: Docker Engine - Community
- Engine:
- Version: 19.03.2
- API version: 1.40 (minimum version 1.12)
- Go version: go1.12.8
- Git commit: 6a30dfc
- Built: Thu Aug 29 05:32:21 2019
- OS/Arch: Linux/amd64
- Experimental: false
- containerd:
- Version: v1.2.6
- GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
- runc:
- Version: 1.0.0-rc8
- GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
- docker-init:
- Version: 0.18.0
- GitCommit: fec3683
出现版本号, 证明安装成功.
下面使用 Mac OS 系统来演示命令, 和输出结果.
3. image 文件
docker 主要有三部分核心内容, image 文件, 容器文件和 Dockerfile 文件. image 文件也称为镜像.
运行这些 docker 命令行前, 需要打开 docker 终端, 也就是上一步下载的 docker App. 否则将会报错
- ? ~ docker images
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
3.1. 列出所有 image 文件
列出所有镜像, 不包含中间层镜像
docker image ls 或 docker images
- ? ~ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- count-web_web latest b9f43a85e594 4 days ago 106MB
- dockerhub.datagrand.com/datagrand/text_similarity_html dev_20191022_103543 be10d00a971c 4 days ago 134MB
- Redis alpine 6f63d037b592 4 days ago 29.3MB
- python 3.6-alpine 6ddaac33408f 4 days ago 95MB
- Ubuntu 18.04 cf0f3ca922e0 7 days ago 64.2MB
上面镜像只截取了部分
REPOSITORY 表示镜像名
TAG 表示镜像标记, 通常是版本号, 或者其他可以区别镜像不同版本的标记
IMAGE ID 表示镜像 ID, 镜像可以通过: 来识别, 也可以通过 来识别
CREATED 表示这个镜像制作的时间
SIZE 表示这个镜像的大小
列出所有虚悬镜像
- docker image ls -f dangling=true
- ? ~ docker images -f dangling=true
- REPOSITORY TAG IMAGE ID CREATED SIZE
表示没有虚空镜像
列出所有镜像, 包含中间层镜像
docker image ls -a 或 docker images -a
- ? ~ docker images -a
- REPOSITORY TAG IMAGE ID CREATED SIZE
- count-web_web latest b9f43a85e594 4 days ago 106MB
- <none> <none> a1f88c27d11b 4 days ago 106MB
- <none> <none> a16622d4261d 4 days ago 95MB
- <none> <none> bff6538a770e 4 days ago 95MB
- dockerhub.datagrand.com/datagrand/text_similarity_html dev_20191022_103543 be10d00a971c 4 days ago 134MB
- <none> <none> 664a0ea6f623 4 days ago 126MB
- <none> <none> 349fc9312606 4 days ago 134MB
- Redis alpine 6f63d037b592 4 days ago 29.3MB
- python 3.6-alpine 6ddaac33408f 4 days ago 95MB
- Ubuntu 18.04 cf0f3ca922e0 7 days ago 64.2MB
出现了很多无标签的镜像, 与之前的虚空镜像不同, 这些无标签的镜像很多都是中间层镜像, 是其他镜像的依赖对象, 只要删除了这些中间层镜像, 这些依赖他们的镜像也将会被删除.
列出指定镜像
docker images <image-name > 根据镜像名来列出镜像
- ? ~ docker images Ubuntu
- REPOSITORY TAG IMAGE ID CREATED SIZE
- Ubuntu 18.04 cf0f3ca922e0 7 days ago 64.2MB
- Ubuntu latest 2ca708c1c9cc 5 weeks ago 64.2MB
- Ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
- Ubuntu 13.10 7f020f7bf345 5 years ago 185MB
latest 表示当前最新版本的镜像
3.2. 删除指定 image 文件
删除 image 文件前, 要先删除容器文件
通过文件名: 标签删除
docker image rm <image name>:<tag> 或 docker rmi <image name>:<tag>
标签名缺省是 latest, 如果标签名是 latest, 则不用添加标签名
docker rmi <image name>:latest 等价于 docker rmi <image name>
- ? ~ docker image rm Ubuntu:13.10
- Untagged: Ubuntu:13.10
- Untagged: [email protected]:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
- Deleted: sha256:7f020f7bf34554411031ec0d4f2ab46a2976dad403e1c26bc21dc1bf4c48c8aa
- Deleted: sha256:2aac093d13faafda4d0da3534d30274bcc4e5475b1e126c84b9d670862f5e4ef
- Deleted: sha256:c676fe3dd3ceb6442e8b23350de88adc6546a52f75bd92dbb1a789b7c6de0fcf
- Deleted: sha256:7c6a37fb8fe6a41aaf7c6c7a2cc3d448c01df026b2056a9f35e490e7bf6285cc
- Deleted: sha256:b0e8be8278c28daa541ad564fc91dbea99263caa6e5e68db033061c5e08f0315
- Deleted: sha256:78dcbd700c6678a7af4422e0ad516628852973a255526f4b617f33db218e1075
- Deleted: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
Untagged, 删除镜像是, 会先将满足我们要求的所有镜像标签都取消
Deleted, 该镜像的所有的标签都被取消了, 该镜像就失去了存在的意义, 因此会触发删除行为. 镜像是多层存储结构, 因此删除的时候也是从上层向基础层依次进行判断删除. 并且给出了完整的 sha256 的摘要
通过文件 ID 删除
docker image rm <image ID> 或 docker rmi <image ID>
- ? ~ docker image rm cf0f3ca922e0
- Untagged: Ubuntu:18.04
- Untagged: [email protected]:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
- Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
- Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
- Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
- Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
- Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36
删除了 Ubuntu TAG 为 18.04 的镜像, 之后在列出 Ubuntu 镜像, 就没有这个镜像了.
- ? ~ docker images Ubuntu
- REPOSITORY TAG IMAGE ID CREATED SIZE
- Ubuntu latest 2ca708c1c9cc 5 weeks ago 64.2MB
- Ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
- Ubuntu 13.10 7f020f7bf345 5 years ago 185MB
3.3. 抓取 image 文件
docker pull <image name> 或 docker image pull <image name>
抓取刚删除的 Ubuntu:13.10 镜像.
- ? ~ docker pull Ubuntu:13.10
- 13.10: Pulling from library/Ubuntu
- [DEPRECATION NOTICE] registry v2 schema1 support will be removed in an upcoming release. Please contact admins of the docker.io registry NOW to avoid future disruption.
- a3ed95caeb02: Pull complete
- 0d8710fc57fd: Pull complete
- 5037c5cd623d: Pull complete
- 83b53423b49f: Pull complete
- e9e8bd3b94ab: Pull complete
- 7db00e6b6e5e: Pull complete
- Digest: sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
- Status: Downloaded newer image for Ubuntu:13.10
- docker.io/library/Ubuntu:13.10
默认抓取的地址是官方的 hub,docker hub, 官方存放镜像的位置默认在 library 目录下
在抓取的时候, 先有一个下载的过程, 镜像是多层存储所构成, 分层下载, 并非单一文件, 下载过程中给出了每一层的前 12 位 ID
下载结束后, 显示 pull complete, 并给出该镜像的完整 sha256 摘要
3.4. 运行 image 文件
通过文件名运行
docker run <image name>:<tag> 或 docker container run <image name>:<tag>
如果文件名不加标签, 会使用 latest 标签
docker run <image name > 等价于 docker run <image name>:latest
- ? ~ docker run hello-world
- Hello from Docker!
- This message shows that your installation appears to be working correctly.
- To generate this message, Docker took the following steps:
- 1. The Docker client contacted the Docker daemon.
- 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
- (amd64)
- 3. The Docker daemon created a new container from that image which runs the
- executable that produces the output you are currently reading.
- 4. The Docker daemon streamed that output to the Docker client, which sent it
- to your terminal.
- To try something more ambitious, you can run an Ubuntu container with:
- $ docker run -it Ubuntu bash
- Share images, automate workflows, and more with a free Docker ID:
- https://hub.docker.com/
- For more examples and ideas, visit:
- https://docs.docker.com/get-started/
运行最简单的 hello-world, 运行完之后, 自动停止了.
通过文件 ID 运行
docker run <image ID> 或 docker container run <image ID>
3.5. 创建 image 文件
- docker image build
- docker image build -t <image name>:<tag> .
-t 指定 image 文件, 最后的 . 表示上下文环境, Dockerfile 在当前路径
docker build -t dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW} -f docker/Dockerfile .
上面镜像名字中包含了镜像存储的地址, 还包含了 ${TIMENOW}这个是一个变量, 表示当前时间 TIMENOW=date +%Y%m%d_%H%M%S
-f 表示过滤条件
3.6. 发布 image 文件
当 image 文件创建成功后, 就可以把它 push 到 hub 上, 供其他人使用了.
首先登录 hub, 不指定 hub 时, 将会登录到 docker hub.
- ? ~ docker login dockerhub.datagrand.com
- Username: lxj327460773
- Password:
登录到 dockerhub.datagrand.com
没有带参数时, 会单独要求输入 Username 和 Password
登录成功后会显示 Login Succeeded
可以带参数登录, 一次性输入账号和密码
- ? ~ docker login dockerhub.datagrand.com -u [email protected] -p <password>
- WARNING! Using --password via the CLI is insecure. Use --password-stdin.
- Login Succeeded
不过这样不安全, 因为直接把密码明文显示了, 所以才会提示 "通过 CLI 使用密码是不安全的".
登录成功后, 可以 psuh 到 hub 了.
docker push dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW}
完成发布后, 可以退出.
- ? ~ docker logout dockerhub.datagrand.com
- Removing login credentials for dockerhub.datagrand.com
- WARNING: could not erase credentials: error erasing credentials - err: exit status 1, out: `error erasing credentials - err: exit status 1, out: `The specified item could not be found in the keychain.`
推出成功后会提示 "删除登录凭证".
4. 容器文件(container)
容器的实质是进程, 容器进程运行于属于自己的独立的命名空间. 容器也是分层存储, 每一个容器运行时, 是以镜像为基础层, 在其上创建一个当前容器的存储层.
4.1. 列出容器文件
列出正在运行的容器文件
docker container ls 或 docker ps
- ? ~ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 667e9e3802fb nginx "nginx -g'daemon of..." 15 minutes ago Up 15 minutes 80/tcp vigilant_ardinghelli
CONTAINER ID 表示容器 ID
IMAGE 表示运行的镜像, 镜像和容器的关系, 就像是面向对象程序设计中类和实例一样, 镜像是静态的定义, 容器是运行时的实体
CREATED 表示运行的时间
STATUS UP 表示运行
PORTS 表示可以通过指定的端口号来访问
NAMES 表示对镜像容器的描述
列出所有的容器文件(包括停止运行的容器)
docker ps -a 或 docker ps --all 或 docker container ls -a 或 docker container ls --all
- ? ~ docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- abb2922a4208 hello-world "/hello" 11 minutes ago Exited (0) 11 minutes ago lucid_gauss
- 667e9e3802fb nginx "nginx -g'daemon of..." 16 minutes ago Up 16 minutes 80/tcp vigilant_ardinghelli
- 42f7edad7bfd PHP "docker-php-entrypoi..." 16 minutes ago Exited (0) 16 minutes ago elegant_mestorf
- 4441f09a1cc1 httpd "httpd-foreground" 17 minutes ago Exited (0) 16 minutes ago jolly_agnesi
- 6a7f573b8164 Ubuntu "/bin/bash" 4 days ago Exited (0) 4 days ago nervous_pascal
COMMAND 表示表示容器启动后运行的命令
STATUS UP 表示运行, Exited 表示已经停止运行了
4.2. 终止容器文件
通过容器 ID 终止
docker stop <container ID> 或 docker kill <container ID> 或 docker container stop <container ID> 或 docker container kill <container ID>
- ? ~ docker stop 667e9e3802fb
- 667e9e3802fb
终止容器会显示容器 ID.
通过容器名终止
docker stop <container name> 或 docker kill <container name> 或 docker container stop <container name> 或 docker container kill <container name>
4.3. 删除容器文件
删除容器前, 必须先终止容器
使用容器 ID 删除容器
- docker rm <container ID>
- ? ~ docker rm 667e9e3802fb
- 667e9e3802fb
删除容器也会显示容器 ID.
使用容器名删除容器
docker rm <container>
4.4. 生成容器
docker container run
携带一些参数指明容器运行的端口和启动后执行的命令, 如:
docker container run -p 8000:3000 -it <image name>:<tag> /bin/bash
-p 参数: 容器的 3000 端口映射到本机的 8000 端口.
-it 参数: 容器的 Shell 映射到当前的 Shell, 然后你在本机窗口输入的命令, 就会传入容器.
/bin/bash: 容器启动以后, 内部第一个执行的命令. 这里是启动 Bash, 保证用户可以使用 Shell.
- ? ~ docker images koa-demos
- REPOSITORY TAG IMAGE ID CREATED SIZE
- koa-demos v1 0e9ae611c443 10 days ago 675MB
- ? ~ docker container run -p 8000:3000 -it koa-demos:v1 /bin/bash
- [email protected]:/App# pwd
- /App
- [email protected]:/App# ls
- Dockerfile README.md demos logo.PNG node_modules package-lock.JSON package.JSON
- [email protected]:/App#
我先查找了我的镜像, 然后运行了它, 并启动了 bash, 保证了 shell 命令可用.
5. Dockerfile 文件
Dockerfile 中的每一条指令都会建立一个层.
- FROM nginx:stable
- RUN mkdir -p Web/logs
- COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
- COPY dist Web/dist
- EXPOSE 80
如上的 Dockerfile 文件中
FROM 指定基础镜像为 nginx, 版本为 stable
RUN 运行命令, 新创建文件夹 Web, 并在其下创建文件 logs
COPY 把 docker 下的 nginx.conf 文件, 和 dist 文件夹拷贝到指定位置, 这里因为项目使用的 angular 所以, build 之后的文件就存储在 dist 目录下
EXPOSE 申明容器使用 80 端口
5.1.FROM 指定基础镜像
基础镜像必须指定, FROM 指令指定基础镜像, 因此一个 Dockerfile 文件中 FROM 是必备指令, 而且是第一个指令.
FROM scratch 指定一个空白镜像, scratch 不以任何镜像为基础, 接下来写的指令将作为镜像第一层开始存在.
5.2. RUN 执行命令行
RUN 是用来执行命令行命令的指令
5.3. COPY 复制文件
COPY 指令将从构建上下文中目录中 <原路径> 的文件 / 目录复制到新一层镜像的的 <目标路径> 位置
5.4. ADD 更高级的复制文件
仅在需要自动解压缩的情况下才使用 ADD 指令, 如果只是复制文件就使用 COPY 指令
5.5. CMD 容器启动命令
用于指定默认的容器主进程的启动命令
5.6. EXPOSE 声明容器使用端口
-p <宿主端口>:<容器端口>
-p, 是映射宿主端口和容器端口, 换句话说, 就是将容器的对应端口服务公开给外界访问
EXPOSE 仅仅是声明容器打算使用什么端口而已, 并不会自动在宿主进行端口映射.
5.7. ENTRYPOINT 入口点
5.8. WORKDIR 指定工作目录
5.9. VOLUME 定义匿名卷
来源: http://www.bubuko.com/infodetail-3258812.html