Docker 是一个容器工具,提供虚拟环境。解决了软件的环境配置和依赖问题,让软件可以带环境和依赖的安装。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
1. 注册 docker 账号
想要使用docker,先注册一个docker账号,注册docker账号。
注册完成后,登录到 docker hub 就能看到自己的 docker 镜像了,docker hub 是 docker 官方存放 docker 镜像的仓库。如我的 hub 下列出了我push的镜像
2. docker 的安装
注册完docker账号,然后安装docker:
window 10
Mac OS
window 10 安装 docker 19.03.2 百度网盘地址
安装完成后可以通过命令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 定义匿名卷
原文地址:https://www.cnblogs.com/xinjie-just/p/11743250.html