docker系列之2使用

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

  1. 有可能是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

修改容器镜像和容器存储位置

参考 https://blog.csdn.net/weixin_43412762/article/details/134571411

1) 查看当前docker的默认存储目录

docker info
# 可以看到docker存储驱动程序和默认存位:
Storage Driver: overlay
Docker Root Dir: /var/lib/docker

2) 备份docker容器和镜像
sudo cp -rf /var/lib/docker 指定目录下,如/data

3) 修改docker配置
3-1) 编辑 /etc/docker/daemon.json 文件

sudo vim /etc/docker/daemon.json

# 默认情况下这个配置文件是没有的,这里实际也就是新建一个,然后写入以下内容:

{
  "data-root": "/data/docker"
}

# 取决于具体的ubuntu版本或者kernel版本决定要用data-root还是graph
# /mnt/docker --> docker的存储路径

# 此文件还涉及默认源的设定,如果设定了国内源,那么实际就是在源地址下方加一行,写成:
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"],
  "data-root": "/data/docker"
}

3-2) 编辑docker配置文件:(编辑这个导致docker启动失败)
sudo vim /etc/systemd/system/multi-user.target.wants/docker.service

# 将ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock注释,修改为以下内容:
ExecStart=/usr/bin/dockerd --graph=/data/docker --storage-driver=overlay
  1. 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker

启动报错找不到 /opt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值