docker

docker配置

ref
$ sudo docker enable 容器名称/ID

ubuntu 安装Docker CE

卸载已有版本
$ sudo apt remove docker docker-engine docker.io containerd runc

使用官方脚本自动安装

$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

通过版本库安装(repository)

1. 设置版本库
(1)更新系统包索引
sudo apt-get update
(2)添加HTTPS协议,允许apt从HTTPS安装软件包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
(3)添加Docker 公共密钥
Docker 官方源:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Docker中科大源:
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

确认一下秘钥
$ sudo apt-key fingerprint 0EBFCD88
如果下一下输出,说明添加成功

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

(4)设置版本库类型(Ubuntu18.04对应版本“bionic“”),软件版本包括三种:** stable、edge、test**

Docker官方源:
sudo add-apt-repository "deb [arch=amd64]  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 
Docker中科大源:
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 

修改的内容位于文件:/etc/apt/sources.list
2. 安装Docker CE
(1)更新系统包索引
sudo apt-get update
查询docker的版本信息
sudo apt-cache madison docker-ce 或者 apt-cache show docker-ce | grep Version
(2)安装最新版Docker CE
sudo apt-get install docker-ce
sudo apt install docker-ce docker-ce-cli containerd.io
安装确定版本:sudo apt install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
3. 确认是否安装成功
sudo docker --version
输出:Docker version 19.03.9, build 9d988398e7

安装docker-compose

  1. 进入https://github.com/docker/compose/releases 查看最新版本,当前版本为1.23.1
    $ sudo curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose
  2. 设置权限
    $ sudo chmod +x /usr/local/bin/docker-compose
  3. 查看是否安装成功
    docker-compose --version

安装portainer

docker volume create portainer_data
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

常见命令

$ docker run –help
查看命令功能与帮助

镜像

容器

从dockerfile创建容器

Build:

docker build -t detectron2-deploy:v0 -f deploy.Dockerfile . # 其中detectron2-deploy:v0 为名字:tag

Launch:

docker run --gpus all -it detectron2-deploy:v0

从镜像创建容器
$ sudo docker create --name 容器名称 镜像名称 # 此命令创建的容器不处于启动状态
$ sudo docker run --name 为容器指定的名称 -i -t 镜像名称 /bin/bash # 其中/bin/bash 是在运行容器时使用命令行输入命令,-i和-t的作用是帮助进入交互模式

$ sudo docker run --name 为容器指定的名称 -it 镜像名称 /bin/bash
启动容器
$ sudo docker start 容器名称/ID
重启容器
$ sudo docker restart 容器名称/ID

进入容器后:
root@7d150a0fb029:/# # 其中root后面是容器id

$ docker run -d ubuntu:16.04 /bin/sh -c “while true; do echo hello world; sleep 1;done” # -d表示在后台运行,后面“”中是运行内容

查看已有容器
$ docker ps -a
#exec是进入已经存在的容器,run是创建新容器
$ docker exec-it c7188be9bd7b /bin/bash

已有容器时再创建会报错,可删除原容器
Q:
docker: Error response from daemon: Conflict. The container name “/replay1” is already in use by contain0cd55e1ef3a9ca16016b1a16d8dc22b". You have to remove (or rename) that container to be able to reuse that
A:

   # 查看有哪些在运行
   docker ps -a
   sudo docker ps
   # 移除
   docker rm target_name
   # 强制移除
    docker rm -f target_name

仓库

docker简单使用

  1. 下载官方镜像
    可以先到docker官网查找镜像,网站,(不一定非要登录)
    sudo docker pull redis:6.0.3 #下载最新redis6
  2. 查看镜像
    sudo docker images
  3. 启动镜像
    实用启动命令
sudo docker run -itd --name redis6 -p 6379:6379 redis:6.0.3
# -i 表示允许你对容器内的标准输入 (STDIN) 进行交互。
# -t 表示制定一个伪终端,一般接/bin/bash 方便exec进入容器后,输入执行命令
# -d 表示后台运行,
# --name 表示容器的名称,后面通过容器名称来,启动,停止,重启容器,名字需要唯一
# -p 表示端口映射,前一个数是宿主机的开端口,后一个数是容量里面的端口,可以不一样
# 最后是镜像名称和tag
# 更多帮助,docker run --help
  1. 查看容器
    查看所有运行容器 sudo docker ps
    查看所有容器包含未运行的 sudo docker ps -a
  2. 停止/重启/启动 容器
    docker stop/restart/start redis6 #最后是容器名,也可以用ps查询的容器ID
  3. 进入容器里面
    sudo docker exec -it <容器名> /bin/bash
  4. 删除容器
    docker rm redis6 #最后是容器名,也可以用ps查询的容器ID

docker-compose使用

  1. 配置文件docker-compose.yml详解
#版本号对象docker的版本,对应关系,请参考官网https://docs.docker.com/compose/compose-file/
version: '3.8'
services:    
    mongodb: #根据你自己的需要设定名字
    #使用指定目录下的Dockerfile进行构建
    build: .
    #相当于docker run命令的-p参数,用于声明对外开放的端口
    container_name: my_app  #声明构建容器的名称,docker-compose start和stop命令可以使用
    ports:
        - "5000:5000" 
       - "8010:80"
  1. docker-compose 常用命令 (需要和docker-compose.yml 在同一目录下执行)
    docker-compose up -d #启动yml文件中所有的镜像
    docker-compose restart #重启yml文件中所有的镜像
    docker-compose down #关闭yml文件中所有的镜像
    注意:如果修改了yml文件或.env文件,需要先down再up才会生效,restart无法生效
  2. 置一个mongodb的compose文件
version: '3.8'
networks:
  mynet:
    external: true
services:
  mongodb:
    image: mongo:4.2.6
    networks:
      - mynet
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/mongo_cluster/2727/db:/data/db
      - /data/mongo_cluster/2727/opt:/opt
    container_name: mongo_main
    environment:
      - MONGO_INITDB_ROOT_USERNAME=qumogu
      - MONGO_INITDB_ROOT_PASSWORD=Qumogu@1604
    command: --auth --bind_ip 0.0.0.0
    ports:
      - 2727:27017
    restart: always
    logging:
      driver: json-file
      options:
        max-file: '2'
        max-size: 100m
  1. 启动docker的容器
    启动前需要先创建网络ref
    docker network create mynet --driver bridge
    docker network ls #显示已创建的网络
    docker-compose up -d 就可以访问了

dockerfile

待续

拷贝本地文件到容器

ref
(1)查找容器
docker ps -a
(2)确定我们的容器名,并获取容器长ID
docker inspect -f ‘{{.ID}}’ store-dev
(3) 拷贝本地文件到容器
docker cp 你的文件路径 容器长ID:docker容器路径
其中容器长ID也可以用容器NAMES代替
注意,两边路径都要加上文件名+文件后缀 ,容器长ID后面是一个:
docker cp /Users/lidongbin/Desktop/RWD97019_20190300/RWD97019_20190300.AVL 33771096c8531094e1996c9b8b3689f149a1cbdb07957983c639c4863ce4eaee:/ftpdata/award/RWD97019_20190300.AVL
(4)进入容器查看是否成功拷贝
docker exec -it store-dev bash

从容器里面拷文件到宿主机

在宿主机里面执行以下命令
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
如:docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt

查看docker环境变量

容器外:
docker inspect OR
docker exec -it OR env
多用:docker exec {containerID} env
$ sudo docker exec 5c166089d95b env
5c166089d95b为容器ID
容器内:
容器的环境变量就是容器中1号进程的环境变量用
cat /proc/1/environ
容器中其他进程的环境变量也可用
cat /proc/{pid}/environ
一般情况下,其他进程都继承了1号进程的环境变量。与主机相同,容器中切换用户后,环境变量会重置。

使用gpu时报错

Q:
DOCKER: ERROR RESPONSE FROM DAEMON: COULD NOT SELECT DEVICE DRIVER “”

确认已检测到NVIDIA卡
lspci -vv | grep -i nvidia
ref

需下载安装 nvidia-container-toolkit,再报错
Q:
E: Unable to locate package
A:
Add the package repositories curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker

其中$distribution改为ubuntu18.04
来源:
https://nvidia.github.io/nvidia-docker/

权限问题

ref
Q: permission denied while trying to connect to the Docker daemon socket
A:
docker进程使用 Unix Socket 而非 TCP 端口。默认情况下,Unix socket 属于root,需要 root权限 才能访问。

sudo groupadd docker          #添加docker用户组
sudo gpasswd -a $XXX docker   #检测当前用户是否已经在docker用户组中,其中XXX为用户名,例如我的,liangll
sudo gpasswd -a $USER docker  #将当前用户添加至docker用户组
newgrp docker                 #更新docker用户组

Image RUN时的一些参数

sudo docker run --rm --gpus all --shm-size 77108864 -it -v /home/qianyitroy/workspace:/home/qianyitroy/workspace -p 10.10.11.59:54005:54005 maskrcnn:v1 /bin/bash

–rm 是在运行结束后删除新建的container
–shm-size 是分配container的共享空间,查看已分配的共享空间要在docker容器内部查看。
–gpus all 运行需要cuda的时候,要带此参数(注意,在run cuda container前需要安装nvidia-docker, 参见nvidia-docker安装
-p 10.12.11.54:54005:54005 宿主机与容器之间端口映射。
-v /home/xxx/github/insightface/models/:/mmdnn/models -v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径
–restart=always 设置重启参数,no 不自动重启容器. (默认value),on-failure 容器发生error而退出(容器退出状态不为0)重启容器, unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器,always 在容器已经stop掉或Docker stoped/restarted的时候才重启容器

统计已exited的容器数量

docker container ps -f status=exited | wc -l 

删除已exited的容器

docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')   # 停止
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')      # 删除
sudo docker container ps -f status=exited | cut -f 1 -d " " | tail -n +2 | xargs docker container rm   # 删除

cut -f 1 -d " " : 取得第一个字段(就是container ID), -d " " 代表分隔符号为空白
tail -n +2 : 跳过第一行(2-1), 从第2行开始(+2 注意别忘记+), 第一行是说明字段的头文件
xargs : 从stdin取得字符串(通过pipe | 每行取一次), 执行后面的语法, 把字符串贴在后面执行
例: echo ls | xargs docker image 相当于 docker image ls

删除none images

docker rmi $(docker images | grep "none" | awk '{print $3}')

docker 服务设置自动启动

查看已启动的服务

systemctl list-units --type=service

查看是否设置开机启动

systemctl list-unit-files | grep enable

设置开机启动

systemctl enable docker.service

关闭开机启动

systemctl disable docker.service

安装问题

Q: Unable to locate package nvidia-container-toolkit

A:

from

#Add the package repositories 
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey 
sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list 
sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit 
sudo systemctl restart docker

$distribution改为ubuntu18.04
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值