据我了解,
Dockerfile就像创建镜像的config/recipe,而docker-compose用于轻松创建多个可能有关系的容器,避免通过docker命令重复创建容器。
有两个文件。
Dockerfile
FROM node:lts-alpine
WORKDIR /server
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3030
CMD ["npm", "run", "dev"]
docker-compose.yml
version: '2.1'
services:
test-db:
image: mysql:5.7
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=true
- MYSQL_USER=admin
- MYSQL_PASSWORD=12345
- MYSQL_DATABASE=test-db
volumes:
- ./db-data:/var/lib/mysql
ports:
- 3306:3306
test-web:
environment:
- NODE_ENV=local
#- DEBUG=*
- PORT=3030
image: node:lts-alpine
build: ./
command: >
npm run dev
volumes:
- ./:/server
ports:
- "3030:3030"
depends_on:
- test-db
问题1
当我运行 docker-compose up --build
a.镜像将基于 Dockerfile 构建
b.那又怎样?
问题2
test-db:
image: mysql:5.7
test-web:
environment:
- NODE_ENV=local
#- DEBUG=*
- PORT=3030
image: node:lts-alpine
我正在使用上面的代码下载 dockerhub 的镜像,但是为什么以及何时需要在 --build 中创建的镜像?
问题3
volumes:
- ./db-data:/var/lib/mysql
这行是否意味着数据应该存储在内存位置 /var/lib/mysql 中,而我将此数据复制到工作目录 ./db-data 中?
更新
问题4
build: ./
这条线是做什么用的?
建议仔细阅读入门,你的大部分问题都会得到解决。
让我尝试向您重点介绍其中一些。
Dockerfile
和Compose file
之间的区别
Dockerfile
用于构建图像,而 Compose
用于构建和运行应用程序。Dockerfile
构建图像,然后通过 Compose
docker-compose up --build
后,图像将构建并缓存在系统中,然后 Compose 将启动由 docker-compose.yml
image
那么它将在构建时下载(如果指定 build: ./
Volumes
持久数据。记住,医生永远是你的朋友。
我遇到了一个 docker 镜像无法工作的问题,我需要推出自己的镜像。 我仍然想使用 compose 将其与我的其他图像一起部署。
我在这里找到了答案:https://docs.docker.com/compose/compose-file/build/#illustrative-example
即使这是一个迟到的答案,我希望它对@123123的问题1有所帮助。
Dockerfile 告诉 Docker 如何创建映像,以及有关该映像的某些方面(例如,它公开了哪些端口)。
但是一旦构建了镜像,您仍然需要运行它,否则您只是拥有一个不执行任何操作的静态镜像文件。虽然您可以“只运行”一个简单的映像,但运行一个复杂的映像可能需要您将两打命令行选项传递给 Docker,告诉它如何实际运行它。例如。如果暴露的端口可从外部使用,则必须将这些端口映射到真实端口。事实上,某些映像目录应该是位于本地文件层次结构中其他位置的卷,以便在映像重新启动后继续存在。每次运行都应设置环境变量。
您可以在一个 compose 文件中定义所有这些,而不是编写超级复杂的命令行调用,该文件只是有关如何实际运行图像的指令的集合。
但最重要的是,compose 可以简化整个设置过程,即它可以首先构建图像,然后运行它。这就是
build: ./
行的用途;它只是告诉 compose 进程在构建镜像时在当前工作目录中查找 Dockerfile。
由于构建、配置和运行镜像的整个过程现在已经简化,您还可以使用 compose 作为部署工具,轻松地将 Docker 镜像内的服务直接部署到服务器并在那里运行。您甚至可以将整个堆栈部署到一堆服务器(Docker 称之为
swarm
)。
例如如果我想直接调用
docker run
来运行图像而不是使用您发布的 compose.yml,则 test-db
的命令将是
docker run -d \
--name test-db \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
-e MYSQL_USER=admin \
-e MYSQL_PASSWORD=12345 \
-e MYSQL_DATABASE=test-db \
-v $(pwd)/db-data:/var/lib/mysql \
-p 3306:3306 \
mysql:5.7
test-web
的命令是
docker run -d \
--name test-web \
-e NODE_ENV=local \
-e PORT=3030 \
-v $(pwd):/server \
-p 3030:3030 \
--link test-db:mysql \
node:lts-alpine \
sh -c "npm run dev"