看完这篇docker文章,再不会来打我!

252 阅读3分钟

是什么

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

补充

  • <>和[]及其内部的东西,表示需要书写正确的值。