Docker 学习笔记

2018年11月08日

docker 官方仓库

https://hub.docker.com/

常用命令

 1# 验证是否安装成功
 2docker version
 3docker info
 4
 5# 列出本机所有 image 文件
 6docker image ls
 7# 删除 image 文件
 8docker image rm [imageName]
 9
10# 从远程仓库拉取 image 至本地
11docker image pull library/hello-world
12# docker 官方提供的 image 文件都放在 library 组里面
13# 或
14docker image pull hello-world
15
16# 运行 image 文件
17# 此命令会在本地没有 image 的情况下自动从远程拉取
18docker container run hello-world
19
20docker container run -it ubuntu bash
21
22# 列出本机正在运行的容器
23docker container ls
24# 或
25docker ps
26# 列出本机所有容器,包括终止运行的容器
27docker container ls --all
28
29# 手动终止容器
30docker container kill [containerID]
31
32# 删除容器文件
33docker container rm [containerID]
34
35# 启动已经生成的容器文件
36docker container start [containerID]
37# 渐进退出
38docker container stop [containerID]
39
40# 查看输出
41docker container logs [containerID]
42
43# 进入一个正在运行的 docker 容器
44# 适用于 docker run 时没有使用 -it 参数的情况
45docker container exec -it [containerID] /bin/bash
46
47# 文件拷贝至本机当前目录
48docker container cp [containerID]:[/path/to/file] .

Dockerfile 文件

Dockerfile 是一个文本文件,用来配置 image。

示例

# 该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node
FROM node:8.4
# 将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录
COPY . /app
# 指定接下来的工作路径为/app
WORKDIR /app
# 在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件
RUN npm install --registry=https://registry.npm.taobao.org
# 将容器 3000 端口暴露出来, 允许外部连接这个端口
EXPOSE 3000
 1# 创建 image 文件
 2# -t 用来指定 image 文件的名字
 3# 后面的冒号指定标签,如果不指定,默认为 latest
 4# 最后的 . 表示 Dockerfile 文件在当前目录
 5docker image build -t koa-demo .
 6# 或者
 7docker image build -t koa-demo:0.0.1 .
 8
 9# 运行成功后就可以看到新生成的 image 文件了
10docker image ls
11
12# 生成容器
13# -p 容器的 3000 端口映射至本机的 8000 端口
14# -it 容器的 Shell 映射至当前的 Shell
15# /bin/bash 容器启动之后,内部第一个执行的命令,这里启动 Bash,保证用户可以使用 Shell
16docker container run -p 8000:3000 -it koa-demo /bin/bash
17# 或
18docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
19
20# --rm 在容器终止运行后自动删除容器文件
21docker container run --rm -p 8000:3000 -it koa-demo /bin/bash

CMD 命令

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000

# 容器启动后自动执行 node demos/01.js
CMD node demos/01.js

RUN 命令和 CMD 命令的区别? RUN 命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD 命令在容器启动后执行。一个 Dockerfile 可以包含多个 RUN 命令,但是只能有一个 CMD 命令。

1# 因为指定了 CMD 命令,所以就不用附加命令了,否则会覆盖 CMD 命令
2docker container run --rm -p 8000:3000 -it koa-demo:0.0.1

发布

1docker login
2
3# 为本地 image 标注用户名和版本
4docker image tag [imageName] [username]/[repository]:[tag]
5# 或者重新构建一下 image 文件
6docker image build -t [username]/[repository]:[tag]
7
8docker image push [username]/[repository]:[tag]

docker container run 命令参数

--name name 定义容器的名字
--volume "$PWD":/var/www/html 将当前目录映射到容器对应的目录
-p 8000:3000 容器的 3000 端口映射至本机的 8000 端口
-d 容器启动后,在后台运行
--env 向容器进程传入一个环境变量

示例 WordPress

A

 1# php
 2docker container run \
 3  -d \
 4  --rm \
 5  --name php \
 6  -p 5000:80 \
 7  --volume "$PWD":/var/www/html \
 8  php:5.6-apache
 9
10# mysql
11docker container run \
12  -d \
13  --rm \
14  --name wpdb \
15  --env MYSQL_ROOT_PASSWORD=123456 \
16  --env MYSQL_DATABASE=wordpress \
17  mysql:5.7
FROM php:5.6-apache
RUN docker-php-ext-install mysqli
CMD apache2-foreground
 1docker build -t phpwithmysql .
 2
 3# --link wpdb:mysql 标识此容器连到 wpdb 容器,冒号表示该容器的别名是 mysql
 4docker container run \
 5  -d \
 6  --rm \
 7  --name php \
 8  -p 5000:80 \
 9  --volume "$PWD":/var/www/html \
10  --link wpdb:mysql \
11  phpwithmysql

B

 1# mysql
 2docker container run \
 3  -d \
 4  --rm \
 5  --name wpdb \
 6  --env MYSQL_ROOT_PASSWORD=123456 \
 7  --env MYSQL_DATABASE=wordpress \
 8  mysql:5.7
 9
10# wordpress
11docker container run \
12  -d \
13  --rm \
14  --name wordpress \
15  -p 5000:80 \
16  --env WORDPRESS_DB_PASSWORD=123456 \
17  --link wpdb:mysql \
18  --volume "$PWD/wordpress":/var/www/html \
19  wordpress

C: Docker Compose

1# 启动所有服务
2docker-compose up
3# 关闭所有服务
4docker-compose stop
5# 删除
6docker-compose rm
7
8# 看是否安装好
9docker-compose --version

docker-compose.yml

 1mysql:
 2  image: mysql:5.7
 3  environment:
 4    - MYSQL_ROOT_PASSWORD=123456
 5    - MYSQL_DATABASE=wordpress
 6web:
 7  image: wordpress
 8  links:
 9    - mysql
10  environment:
11    - WORDPRESS_DB_PASSWORD=123456
12  ports:
13    - 5000:80
14  working_dir: /var/www/html
15  volumes:
16    - wordpress:/var/www/html