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