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 -c "yarn install && yarn run dev" sh
启动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
- 本文作者: fishedee
- 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议,转载必须注明出处!