文章目录
docker
3、使用
https://docs.docker.com/get-started/
该指南可以教你使用docker
1)创建和运行镜像
2)分享镜像到docker hub
3)通过多个数据库容器部署应用
4)使用Docker Compose运行应用
基本概念
Container
Image
通过Dockerfile构建容器
进入项目目录,编辑文件Dockerfile
(以下是一个例子)
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
制作镜像
docker build -t getting-started .
启动镜像
docker run -dp 127.0.0.1:3000:3000 getting-started
修改镜像
#重新制作镜像
docker build -t getting-started .
#移除旧的容器
docker ps
docker stop <the-container-id>
docker rm <the-container-id>
#启动镜像
docker run -dp 127.0.0.1:3000:3000 getting-started
排除不必要的文件
发布镜像到Docker Hub
参考
https://docs.docker.com/get-started/04_sharing_app/
镜像导出与导入
docker save aba01f181a4a > /opt/webconsole.tar
# 可选压缩
gzip webconsole.tar
# 解压缩
gzip -d webconsole.tar.gz
docker load < webconsole.tar
容器保存
docker commit containerid image_name:version
使用Volume来持久化数据
特点:不关心数据内容和存放位置,自动保存到宿主机器的某个目录下
创建Volume
docker volume create todo-db
启动镜像时映射Volume
docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
查看Volume存放位置
docker volume inspect todo-db
直接挂载宿主机目录来持久化数据
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
PS:该方法也可以这样使用,项目代码放在宿主机上,创建镜像安装所需运行环境,启动镜像提供服务。这样做可以在同一宿主机上运行多个环境。
多容器应用
参考https://docs.docker.com/get-started/07_multi_container/
Docker Compose,协助定义和启动多容器应用
https://docs.docker.com/get-started/08_using_compose/
'''
# 示例
目录结构
dir
|——back-end
|——Dockerfile-backend
|——front-end
|——Dockerfile-frontend
'''
$ cat docker-compose.yml
version: '3'
services:
backend:
build:
context: ./back-end
dockerfile: Dockerfile-backend
ports:
- "5001:5001"
frontend:
build:
context: ./front-end
dockerfile: Dockerfile-frontend
ports:
- "3000:3000"
加速镜像构建
参考 https://docs.docker.com/get-started/09_image_best/
优化Dockerfile
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
使其在build的时候,尽量使用layer cache,从而节省构建时间
[+] Building 1.2s (10/10) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 37B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/node:18-alpine
=> [internal] load build context
=> => transferring context: 450.43kB
=> [1/5] FROM docker.io/library/node:18-alpine
=> CACHED [2/5] WORKDIR /app
=> CACHED [3/5] COPY package.json yarn.lock ./
=> CACHED [4/5] RUN yarn install --production
=> [5/5] COPY . .
=> exporting to image
=> => exporting layers
=> => writing image sha256:91790c87bcb096a83c2bd4eb512bc8b134c757cda0bdee4038187f98148e2eda
=> => naming to docker.io/library/getting-started
宿主机支持docker-gpu
参考
https://blog.csdn.net/weixin_44966641/article/details/123760614
gpu启动
docker run -it --gpus all image_name:tag_name
报错:docker: Error response from daemon: could not select device driver “” with capabilities: [[gpu]].
解决方案:
编写脚本
# nvidia-container-runtime-script.sh
sudo curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
sudo curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install nvidia-container-runtime
并运行bash nvidia-container-runtime-script.sh
最后重启docker systemctl restart docker
- 有可能是docker环境问题
docker19 及之后的版本中使用 nvidia gpu 已经不需要单独安装 nvidia-docker 了,这已经被集成到了 docker 中。
ps: 强烈推荐直接安装pytorch官方的镜像,
https://hub.docker.com/r/pytorch/pytorch/tags?page=1&name=11.7
容器开机自启
# docker服务开机自启
sudo systemctl enable docker.service
# 创建容器时设置开机自启
docker run -itd --restart=always --name 设置容器名 使用的镜像
# 更新容器为开机自启
docker update --restart=always 容器ID(或者容器名)
-d 后台运行
以root用户进入容器
docker exec --privileged -u root -it 容器ID(或者容器名) bash
查看容器日志
docker logs -f -t --since="2020-02-08" --tail=50 CONTAINER_ID
docker logs -n 50 CONTAINER_ID
查看容器启动命令
方法1:进入容器后,使用ps -fe 查看进程1
$ docker exec -it -u root container_id bash/sh
# ps -fe
PID USER TIME COMMAND
1 root 0:00 /bin/sh ./entrypoint.sh
7 root 1:26 node /usr/local/bin/pm2 start ./pm2.json --no-daemon
18 root 5:50 next-server
25 root 5:50 next-server
54 root 0:00 sh
67 root 0:00 ps -fe
修改容器镜像和容器存储位置
参考2: https://blog.csdn.net/weixin_54936485/article/details/138315133
- 使用软链接
我们知道在操作系统当中,默认情况下 Docker 容器的存放位置在 /var/lib/docker 目录下面,可以通过下面命令查看具体位置。
sudo docker info | grep "Docker Root Dir"
解决默认存储容量不足的情况,最直接且最有效的方法就是挂载新的分区到该目录。但是在原有系统空间不变的情况下,所以采用软链接的方式,修改镜像和容器的存放路径达到同样的目的。
#拷贝docker内容
cp -rf /var/lib/docker /data/docker
#暂停服务
systemctl stop docker
#缓存原有的内容
mv -f /var/lib/docker /var/lib/docker1
#建立软链接
ln -sf /data/docker /var/lib/docker
#重启测试
sudo systemctl daemon-reload
sudo systemctl restart docker
#删除缓存
rm -rf /var/lib/docker1