# docker 命令

docker-compose 国内安装镜像

curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
1

# 启动

service docker start
# or
systemctl start docker
1
2
3

# 镜像 image

# 查看本机所有镜像
docker image ls

# 删除镜像
docker image rm [镜像名称]

# 拉取镜像 docker image pull [library/]hello-world
# library 为默认分组,可以忽略
docker image pull [镜像名称]

# 通过 Dockerfile 文件创建 image
# docker image build -t kaige:0.0.1 ./home
docker image build -t [镜像名称]:[版本号默认latest] [Dockerfile文件所在目录]

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 发布 image

hub.docker.comcloud.docker.com 注册一个账户, 使用如下命令登陆:

docker login
1

然后执行如下命令给镜像打 tag:

# docker image tag hello:0.0.1 kaige/hello:0.0.1
docker image tag [镜像名称] [username]/[repository]:[tag]

# 或者重新构建 image
docker image build -t [username]/[repository]:[tag] [Dockerfile文件所在目录]
1
2
3
4
5

最后执行如下命令发布:

docker image push [username]/[repository]:[tag]
1

# 容器 container

# 查看本机正在运行的容器
docker container ls

# 查看本机所有容器
docker container ls --all
1
2
3
4
5
# 创建一个容器 (每执行一次都会生成一个容器文件)
docker container run [镜像名称]
1
2

运行 image 文件会生成一个容器实例,这个容器实例也是一个文件,因此容易一旦生成, 会同时存在 image 文件容器文件

const 容器文件 = new image()

# --rm 参数表示关闭终止容器时,自动删除容器文件
docker container run --rm -p 8080:80 -it [镜像名称] /bin/bash
1
2

容器的启动与停止

# 启动一个容器
docker container start [容器ID]

# 停止一个容器
docker container stop [容器ID]

# 删除容器文件
docker container rm [容器ID]

# 终止一个容器
docker container kill [容器ID]
1
2
3
4
5
6
7
8
9
10
11

# Dockerfile

如何编写 dockerfile 文件

FROM node:8.0
COPY . /app
WORKDIR /app
RUN npm install
EXPOSE 300
CMD node app/index.js
1
2
3
4
5
6

Dockerfile 语法解析:

  • FROM node:80: 继承官方的 node 镜像
  • COPY . /app: 将当前目录所有内容复制到镜像中的 app 目录下(如果没有 app 文件夹会自动创建)
  • WORKDIR /app: 指定接下来的工作路径为 /app
  • RUN npm install: 在 /app 目录下执行 npm install 命令
  • EXPOSE 3000: 将容器 3000 端口暴露出来,允许外部连接
  • CMD node app/index.js: 执行 node app/index.js 启动服务

总结:拉取 node 镜像,然后将当前目录文件拷贝到容器的 /app 路径下, 并且指定接下来的工作路径为 /app, 然后运行 npm 命令,安装依赖,然后暴露出 3000 端口, 最后启动 node 服务,这样外界就可以通过 http://localhost:3000 访问容器里的 node 服务的内容了

# RUN 命令 CMD 的区别

  • RUN 命令在镜像文件构建阶段执行,执行的结果会打包进入进镜像文件;
  • CMD 命令则是在容器启动后执行

一个 Dockerfile 可以包含多个 RUN 命令,但是只能有一个 CMD 命令

如果指定了 CMD 命令,那么在 docker container run 后面就不能再附加命令了,比如前面的 /bin/bash, 否则会覆盖 CMD 命令

# 其他

# 查看日志
docker container logs [容器ID]

# 进入正在运行的容器
docker container exec -it [容器ID] /bin/bash

# 将容器里的文件拷贝到本机
docker container cp [容器ID]:[文件路径] [本机地址]
1
2
3
4
5
6
7
8