翻译自官方文档
Part1:定位和安装
运行教程容器
docker run -d -p 80:80 docker/getting-started
Part2:简单的应用
构建应用容器的镜像
-
创建DockerFile文件 # syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
-
构建容器镜像 docker build -t getting-started .
启动应用容器
-
启动容器 docker run -dp 3000:3000 getting-started
-
在http://localhost:3000中查看应用
Part3:更新应用程序
更新源码
-
修改src/static/js/app.js -
构建新的镜像 docker build -t getting-started .
删除旧的容器
-
获取容器ID docker ps
-
停止旧容器 # Swap out <the-container-id> with the ID from docker ps
$ docker stop <the-container-id>
-
移除旧容器 docker rm <the-container-id>
合并停止和移除指令
docker rm -f <container-id>
启动新的应用容器
-
启动新容器 docker run -dp 3000:3000 getting-started
-
刷新浏览器
Part4:应用程序共享
创建仓库
- 登录Docker Hub
- 点击Create Respository按钮
- 命名,确保可见性为Public
- 点击Create按钮
推送镜像
-
登录Docker Hub docker login -u YOUR-USER-NAME
-
重命名镜像 docker tag getting-started YOUR-USER-NAME/getting-started
-
推送镜像 docker push YOUR-USER-NAME/getting-started
在一个新实例上运行镜像
-
打开Play with Docker -
点击登录,选择docker -
连接至Docker Hub账号 -
点击ADD NEW INSTANCE -
启动刚刚推送的应用 docker run -dp 3000:3000 YOUR-USER-NAME/getting-started
-
查看3000端口
Part5:数据持久化
新建两个容器
-
新建一个ubuntu 容器,同时创建内容为一个随机数字的/data.txt 文件 docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
-
查看文件内容 ubuntu容器shell终端命令: cat /data.txt
使用dockers exec命令行: docker exec <container-id> cat /data.txt
-
启动相同镜像的另一个ubuntu容器,并查看目录 docker run -it ubuntu ls /
持久化todo数据
-
创建卷 docker volume create todo-db
-
创建应用程序容器,指定卷挂载: docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
-
在浏览器中查看todo数据,删除容器后重新创建,可以看到todo数据仍然在列表中
查看数据存储信息:
docker volume inspect todo-db
Part6:使用绑定挂载
启动一个开发模式容器
-
在PowerShell下输入命令: docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
node:12-alpine `
sh -c "yarn install && yarn run dev"
-
查看日志 docker logs -f 8f660e5ddb02
-
修改src/static/js/app.js 中的代码,刷新浏览器,可以看到更新
part7:混合容器应用程序
启动MySQL
-
创建网络 docker network create todo-app
-
创建mySQL容器并将它连接到网络,并定义环境变量 docker run -d `
--network todo-app --network-alias mysql `
-v todo-mysql-data:/var/lib/mysql `
-e MYSQL_ROOT_PASSWORD=secret `
-e MYSQL_DATABASE=todos `
mysql:5.7
-
连接数据库 docker exec -it <mysql-container-id> mysql -u root -p
-
输入密码后,显示数据库: SHOW DATABASES;
连接mySQL
-
使用nicklaka/netshoot镜像创建一个新的容器: docker run -it --network todo-app nicolaka/netshoot
-
查找mySQL主机的IP地址 dig mysql
用MySQL运行应用程序
-
修改数据库权限 mysql> ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY 'secret';
mysql> flush privileges;
-
指定环境变量,并将容器连接到应用程序网络。 docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
--network todo-app `
-e MYSQL_HOST=mysql `
-e MYSQL_USER=root `
-e MYSQL_PASSWORD=secret `
-e MYSQL_DB=todos `
node:12-alpine `
sh -c "yarn install && yarn run dev"
-
查看日志 docker logs <container-id>
-
在浏览器中打开应用程序并向todo列表中添加内容 -
连接mysql数据库并验证内容已经被写入数据库 docker exec -it <mysql-container-id> mysql -p todos
在mysql sell中运行 select * from todo_items;
Part8:使用Docker Compose
安装Docker Compose
查看版本
docker-compose version
创建Compose文件
- 在app项目的根目录下,创建
docker-compose.yml 文件 - 定义模式版本
- 定义希望作为应用程序的一部分运行的服务(或容器)列表
version: "3.7"
services:
定义应用服务
PS> docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
--network todo-app `
-e MYSQL_HOST=mysql `
-e MYSQL_USER=root `
-e MYSQL_PASSWORD=secret `
-e MYSQL_DB=todos `
node:12-alpine `
sh -c "yarn install && yarn run dev"
-
定义容器的服务条目和镜像 -
定义指令 -
定义服务端口 -
定义工作目录和卷 -
迁移环境变量 version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
定义MySQL服务
PS> docker run -d `
--network todo-app --network-alias mysql `
-v todo-mysql-data:/var/lib/mysql `
-e MYSQL_ROOT_PASSWORD=secret `
-e MYSQL_DATABASE=todos `
mysql:5.7
- 定义新服务并命名为
mysql - 定义卷映射
- 指定环境变量
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
运行应用程序堆栈
-
启动应用程序堆栈 docker-compose up -d
-
查看日志 docker-compose logs -f
Part9:镜像构建的最佳实践
安全性扫描
docker scan getting-started
镜像层
docker image history getting-started
展开所有内容:
docker image history --no-trunc getting-started
层缓存
-
更新Dcokerfile # syntax=docker/dockerfile:1
FROM node:12-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
-
创建dockerignore node_modules
-
创建一个新镜像 docker build -t getting-started .
-
修改src/static.index.html -
重新构建镜像 docker build -t getting-started .
这一次构建使用了缓存
多级构建
React的例子:
# syntax=docker/dockerfile:1
FROM node:12 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
|