是什么
docker容器
类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
镜像自身是只读的。容器从镜像启动时,会在镜像的最上层创建一个可写层。
CentOS 安装与控制
安装
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
# 检查是否安装
$ docker version
启动docker服务
$ sudo systemctl start docker
停止docker服务
$ sudo systemctl stop docker
卸载 docker
删除安装包:
$ yum remove docker-ce
删除镜像、容器、配置文件等内容:
$ rm -rf /var/lib/docker
镜像(image)
安装镜像
$ docker pull <image name>
查看docker所有镜像
$ docker images
删除镜像
# 简写
$ docker rmi <image name>
$ docker image rm <image name>
# 或者指定id
$ docker image rm <id>
容器(container)
查看所有容器
$ docker container ls -a
查看正在运行的容器
$ docker container ls
查看容器的id
$ docker container ls -aq
删除容器
$ docker container rm <id>
强制删除容器
$ docker container rm <id> -f
运行模式
映射端口
$ docker container run --rm -p <服务器port>:<容器port> <image name>
- 补充:
--rm
当容器停止运行时,自动删除容器
前台运行模式
$ docker container run -p 90:80 <image name>
- 优势:可以查看日志
后台运行模式
$ docker container run --detach -p 90:80 <image name>
# 简写
$ docker container run -d -p 90:80 <image name>
- 优势:后台模式必须手动关闭。
后台模式转前台模式
# docker attach <id>
detach模式下如何查看日志
# 跟踪一次日志
$ docker container logs <id>
# 跟踪刷新日志
$ docker container logs -f <id>
attach模式进入容器内部(进入交互模式)。
# sh -> 使用shell脚本执行命令
# -it -> 进入交互模式
# run 会从指定的镜像启动一个全新的容器实例。
$ docker container run -it <image name> sh
detach模式进入容器内部
# exec 是在已经存在且正在运行的容器中执行命令
$ docker container exec -it <id> sh
- 特性:detach模式退出交互模式,容器不会退出。
Dockerfile
Dockerfile 是一个包含用于组合镜像的命令文本文档,可以使用在命令行中的调用任何命令。Docker通过读取Dockerfile中的指令自动生成镜像。
- Dockerfile是用于构建docker镜像的文件;
- Dockerfile里包含了构建镜像所需的指令;
- Dockerfile有其特定的语法规则;
Dockerfile指令
举例
# 选择一个体积小的镜像 (~5MB)
FROM node:14-alpine
# 设置为工作目录,以下 RUN/CMD 命令都是在工作目录中进行执行
WORKDIR /code
# 把宿主机的代码添加到镜像中,.代表宿主机的文件路径。
# ADD: 拷贝宿主机文件到容器,可以指定解压包。
ADD node.tar /code
# COPY: 拷贝宿主机文件到容器
COPY . /code
# ENV: 定义一个静态变量,变量可以带入到镜像中,使用方式:${VERSION}。
ENV VERSION=16.14.2
# ARG: 定义一个动态变量,使用方式:docker image build -f dockerfile -t test --build-arg VERSION=12.13.1
ARG VERSION=16.14.2
# 安装依赖,多个层使用 && \ 进行链接。
RUN pnpm i
# 声明运行时容器提供服务的端口
EXPOSE 3000
# 启动 Node Server, npm start ≈ pm2 main.js
CMD npm start
设置数据持久化
- volume
FROM node:16-alpine
VOLUME ["/app"] # 会把目录下的文件都做持久化
$ docker image build -t my-image .
$ docker image ls
$ docker container run -d my-image
# 自定义设置volume的local name
docker container run -d -v my-data:/app my-image
# 查看volume信息
$ docker volume ls
# 查看数据缓存地址
$ docker volume inspect <hash>
# 删除容器
$ docker container rm -f <container id>
构建镜像
- Dockerfile.dev
FORM node:16.14.2
ENV VERSION=16.14.2
RUN wget https://nodejs.org/dist/v${VERSION}/node-v${VERSION}.tar.gz && \
tar zxf node-v${VERSION}.tar.gz && \
mv node-v${VERSION} node && \
rm -f node-v${VERSION}.tar.gz
- shell command
$ docker image build -f dockerfile.dev -t <输出名> .
docker-compose.yml
可以逐一执行很多相关的Docker命令,这种形式可以减少出错和解决复用问题。
Docker很贴心的为我们准备了一个专门的工具docker-compose
,实现类似sh
文件的功能,让我们更加轻松的实现多Docker命令的操作。
- 优势:可以同时管理和运行多个容器。
- 如果需要单独安装执行以下命令
# github地址
$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 其他地址,安装速度快。
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 添加可执行权限
$ sudo chmod +x /usr/local/bin/docker-compose
# 添加软连
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看是否安装成功
$ docker compose version
- 文件内容指令介绍
version: "3" # 对应 Docker Engine release 的 Compose file format 版本号
services: # 容器
[servicenname]: # [servicenname]为服务的名字,这个名字也是内部bridge网络可以使用的DNS name
container_name: # 给容器取一个名字
image: # 镜像的名字
command: # 可选,如果设置则会覆盖默认镜像里面的CMD命令
environment: # 可选,相当于 docker run 里的 --env
volumes: # 可选,相当于 docker run 里的 -v
networks: # 可选,相当于 docker run 里的 --network
ports: #可选,相当于 docker run 里的 -p
build: [./] # 可选,指定一个目录
image: mynode:laster # 可选,给一个本地镜像取名
context: .
dockerfile: <dockerfile name> # 指定编写的dockerfile文件名称
volumes: # 可选,相当于 docker volume create
networks: # 可选,相当于 docker network create
- 示例
version: "3"
services:
my-node:
image: node:16-aipline
ports:
- 3000:80
- 运行docker compose命令
# detach 运行,不填写容器名将启动所有配置。
$ docker compose up -d [容器名]
# --build 可以查看构建过程日志
$ docker compose up -d --build [容器名]
# 删除
$ docker compose rm
# 全部清除
# 用以强制删除,不提示信息。
$ docker system prune -f
# 清除所有未被使用的镜像和悬空镜像
$ docker system prune -a
# 查看
$ docker compose ps
# 停止
$ docker compose stop
docker中的网络模式
- 查看主机上已经有的网络配置列表
docker network ls
Docker有四种网络模式
- bridge模式(默认): 每个容器有自己的network,通过localhost访问不到宿主机
$ docker run -d --name nginx
# 创建一个自定义名称的容器nginx1,并将宿主机端口与容器端口进行映射。
$ docker run --name nginx1 -d -p [服务器端口]:[容器端口] nginx
- host模式: 容器和宿主机共享network,这时候localhost就可以访问宿主机端口了。
#
$ docker run --name nginx2 --network=host -d nginx
- none模式: 容器与宿主机隔绝,不能联网,安全性最高,一般很少用到。
$ docker run -it --net=node busybox
- container模式: 容器A和容器B共享network,就是说容器之间可以通过localhost直接访问。
$ docker run -d --name nginx3 --net container:nginx2 nignx
在容器内直接访问宿主机localhost ip
- 有4种个方式
// host.docker.internal 是一个开发功能,只在 Docker Desktop 有效。
// doker-compose.yml中修改host,可以使用 host.docker.internal
some-images:
extra_hosts:
- "host.docker.internal:host-gateway"
// 也可以更改 `/etc/docker/daemon.json` 来绑定指定的ip
{
"bip":"172.0.0.1/24"
}
// doker-compose.yml中network。
version: "3"
services:
some-images:
network_mode: "host"
docker导入和导出
# 导出镜像
$ docker image save [导出的镜像名称]:[版本号] -o <myDockerName>.image
# 导入镜像
$ docker image load -i .\<myDockerName>.image
补充
- <>和[]及其内部的东西,表示需要书写正确的值。