docker经验汇总

2023-08-22 fishedee 后端

0 概述

docker经验汇总,docker是一个很好用的工具,它能实现:

  • 简化部署过程,多个中间件的配置与依赖,启动与关闭,网络配置,磁盘文件配置都能很好地透明化处理。
  • 多版本共存,同一台机器上使用不同的Java运行时,不同的Python运行时
  • 分布式系统上的自动扩容和监控

暂时来说,docker对于快速部署中间件,和开发环境帮助较大。

官方文档在这里

官网仓库在这里

1 安装

1.1 Windows

最新版的Windows docker推荐在WSL2环境下使用,也就是我们启动docker以后,可以直接在WSL2的环境里面使用docker命令行。

先到这里下载docker for windows 并且安装。

安装完毕以后,打开Docker Desktop.exe,选择设置->开机自启。

这个时候,进入WSL2,输入docker info,可以看到docker信息

2 配置

2.1 代理

在左边的Resources-> Proxies,填入对应的代理设置

2.2 镜像

{
  "registry-mirrors": [
    "https://.mirror.aliyuncs.com"
  ]
}

在Docker Engine填入镜像地址,没有镜像真的卡爆了

3 快速入门

官方文档写得非常好,难得的循序渐进的描述方式

3.1 创建和启动镜像

git clone https://github.com/docker/getting-started-app.git
cd getting-started-app
touch Dockerfile

下载模板

# syntax=docker/dockerfile:1

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

填写Dockerfile在项目目录上

docker build -t getting-started .

创建镜像,-t是指镜像tag

docker run -dp 127.0.0.1:3000:3000 getting-started

启动镜像,-d是daemon模式,-p是端口映射,从容器的3000端口映射到本地127.0.0.1:3000端口。

3.2 容器管理

docker ps

查看当前所有容器

docker stop [id]

停止容器

docker rm -f [id]

删除容器的镜像, -f是force,表示停止且删除

3.3 发布和拉取镜像

docker tag getting-started YOUR-USER-NAME/getting-started

将当前的getting-started镜像进行发布到镜像仓库

docker pull bitnami/kafka:latest
docker pull bitnami/kafka:[TAG]

这里有公开的镜像仓库

3.4 持久化

docker持久化的方式有两种,volume(卷)和bind(绑定)。区别如上:

3.4.1 volume

docker volume create todo-db

创建卷

docker volume ls

查看卷

docker volume inspect todo-db

查看卷的具体存储位置

docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

绑定卷的方法,在run的时候,使用–mount type=volume,src=todo-db,target=/etc/todos来绑定,绑定的意思是,src为卷名,target为绑定到镜像内的文件位置

docker run -dp 127.0.0.1:3000:3000 -v todo-sb:/etc/todos getting-started

可以使用简化写法,-v src:target的方式来写。

3.4.2 bind

docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash

bind的方式更加简单,直接将本地目录映射到镜像内的目录,命令为–mount type=bind,src=/xxx,target=/src

3.5 网络

docker镜像有自己内部的网络,docker网络的特别在于:

  • docker可以创建一个命名的私有网络环境,该环境有自己的IP,端口,甚至有自己的域名解释方式。
  • 每个容器启动以后,可以指定自己特有的域名,其他镜像连接到这个网络的时候,可以用自己域名来自己路由到对方。这样的网络特别支出
  • 当容器启动的时候,没有指定自己的网络环境,docker会为该容器启动一个独立的网络环境。

docker network ls

查看当前的docker网络环境

docker network create todo-app

创建一个命名为todo-app的网络环境

docker run -d \
    --network todo-app --network-alias cc \
    -v todo-mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=todos \
    mysql:8.0

在启动镜像的时候,可以用–network todo-app来指定接入哪个网络环境,同时使用–network-alias来指定自身的DNS域名命名为cc。最后,这里注意一下,使用-v todo-mysql-data:/var/lib/mysql来创建todo-mysql-data卷,将mysql数据持久化到本地

docker run -dp 127.0.0.1:3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=cc \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:18-alpine \
  sh -c "yarn install && yarn run dev"

启动node镜像,可以用–network todo-app来指定接入哪个网络环境,并且接入到该网络环境的mysql中,mysql的地址以域名的方式指定,刚好就是cc域名。

4 命令

4.1 build/tag

# syntax=docker/dockerfile:1

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

将文件写在Dockerfile中

docker build -t getting-started .

创建镜像,并命名为getting-started名称,最后一个参数是地址

4.2 image

docker image ls

查看本地的所有镜像

4.3 tag/pull/push

docker tag getting-started YOUR-USER-NAME/getting-started

将当前的getting-started镜像打tag

docker push YOUR-USER-NAME/getting-started

将打tag的镜像推送到公开的镜像仓库

docker pull bitnami/kafka:latest
docker pull bitnami/kafka:[TAG]

这里有公开的镜像仓库

4.4 run/exec

run与exec的区别在于:

  • docker run;创建和启动一个新的容器实例,操作对象是镜像,选项较多,如果你要创建和启动一个容器,只能用run;
  • docker exec: 在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;

参数含义:

  • -d,后台运行容器,并返回容器ID,此时不会进入交互界面,如果想要进入交互界面请加-i和-t参数。如果用了-d参数,再想进入容器,指令:
  • -i,以交互模式运行容器,通常与 -t 同时使用;
  • -t,为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -P,随机端口映射,容器内部端口随机映射到主机的端口
  • -p,指定端口映射,格式为:主机(宿主)端口:容器端口
  • -w, 启动时默认的working directory
  • –name,–name=“xxxxx”: 为容器指定一个名称,名字叫xxxxx;这样下次使用exec的时候,可以直接指定name,而不用id
  • -e,-e username=“ritchie”: 设置环境变量;
  • -m,设置容器使用内存最大值;
  • -h,指定容器的hostname
  • -net,–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • -link,–link=[]: 添加链接到另一个容器;
  • -expose,–expose=[]: 开放一个端口或一组端口;
  • –rm,让容器在退出时,自动清除挂在的卷,以便清除数据

常见用法:

  • docker exec -it 容器id(名称)/bin/bash,进入容器内部,并启动bash进行直接的交互
  • docker exec 容器id(名称) bash -c “ls -l | grep etc”,如果不执行直接的交互,我们可以省略-it参数,直接用bash -c 的方式来执行指定的脚本。
  • docker exec -expose 80,只是声明了容器的对外端口,并没有真正让实际在宿主机打开这个端口。只有用-p或者-P打开了端口映射,才能在宿主机中用端口映射来访问。而-expose声明端口以后,我们可以简单使用-P来做映射到本地的随机端口。
  • docker run -dp 127.0.0.1:3000:3000 getting-started, 使用-p来进行本地端口映射

4.5 ps/stop/rm

docker ps

查看当前所有容器

docker stop [id]

停止容器

docker rm -f [id]

删除容器的镜像, -f是force,表示停止且删除

4.6 volume

docker volume create todo-db

创建卷

docker volume ls

查看卷

docker volume inspect todo-db

查看卷的具体存储位置

docker run xxx -v todo-sb:/etc/todos getting-started

启动镜像的时候,使用-v参数来挂载卷,使用-v方式挂载卷的时候,当卷不存在时会自动创建卷。

4.7 bind

docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash

bind的方式更加简单,直接将本地目录映射到镜像内的目录,命令为–mount type=bind,src=/xxx,target=/src

4.8 logs

docker logs -f <container-id>

查看指定container-id的日志,也就是stdout和stderr的输出

4.9 network

docker network ls

查看当前的docker网络环境

docker network create todo-app

创建一个命名为todo-app的网络环境

docker run -d --network todo-app --network-alias cc xxx

在启动镜像的时候,可以用–network todo-app来指定接入哪个网络环境,同时使用–network-alias来指定自身的DNS域名命名为cc。

docker run --network todo-app -e MYSQL_HOST=cc node:18-alpine 

启动node镜像,可以用–network todo-app来指定接入哪个网络环境,并且接入到该网络环境的mysql中,mysql的地址以域名的方式指定,刚好就是cc域名。

docker run -it --network todo-app nicolaka/netshoot
dig cc

可以使用nicolaka/netshoot镜像来测试todo-app的网络环境

4.10 update与自启

docker update --restart=always d60878d3107d

docker update用来更新docker run的参数,其中的–restart=always参数可以保证当容器掉线的时候自动重启,而且当docker启动的时候,也能启动这些容器。我们可以先用docker ps -a获取当前所有的容器,然后再指定启动。

compose.yaml也可以配置自启动

5 compose

docker compose就是将多个docker镜像合并起来一起使用就可以了

5.1 配置

services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 127.0.0.1:3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

配置环境写在compose.yaml上

5.2 up

docker compose up -d

启动compose

5.3 down

docker compose down

停止compose

5.4 logs

docker compose logs -f xxx

-f参数是不停止获取最新的logs,xxx可以加可以不加,不加的时候显示所有的service,加的时候只过滤对应的service的logs

相关文章