Docker简单使用手册
- Docker安装
- 安装相关包
- 添加软件仓库
- 官方仓库
- 阿里云仓库(建议使用)
- 安装Docker
- 添加访问权限
- 运行docker测试
- Docker常用命令
- 启动与停止
- 列出本地镜像
- 搜索镜像
- 下载镜像
- 删除本地镜像
- 镜像备份与迁移
- Docker容器操作
- 打包自己的镜像
- 创建一个文件夹(文件名任意)
- 创建镜像
- 一些常见问题
- 解决docker容器中文乱码
- 临时方法(退出容器后失效)
- 永久修改
- docker挂载本地目录和数据卷容器
- docker挂载本地目录
- docker数据卷容器
- nvidia-docker的使用。
- 参考资料
Docker安装
环境:Ubuntu16.04
安装相关包
$ sudo apt-get update # 先更新一下软件源库信息
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
添加软件仓库
官方仓库
# 添加 Docker 官方的 GPG 密钥(为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥)
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 设置稳定版本的apt仓库地址
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
阿里云仓库(建议使用)
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
安装Docker
$ sudo apt-get update
$ sudo apt-get install docker-ce # 安装最新版的docker社区版
# 如果需要安装指定版本的,使用以下命令:
$ apt-cache policy docker-ce # 查看可供安装的所有docker版本社区版
$ sudo apt-get install docker-ce=18.03.0~ce-0~ubuntu # 安装指定版本的docker
# 检查docker是否安装成功
$ docker --version # 查看安装的docker版本
添加访问权限
先查看权限
$ cd /var/run
$ ll | grep docker
# 输出如下
drwx------ 8 root root 180 11月 21 16:36 docker
-rw-r--r-- 1 root root 5 11月 21 16:35 docker.pid
srw-rw---- 1 root docker 0 11月 21 16:35 docker.sock
可以看到 docker.sock 的所有者是 docker 这个组。所以我们要把当前用户添加到这个组里。
$ sudo gpasswd -a ${USER} docker
# 重启docker
sudo service docker restart
# 切换当前会话到新 group 或者重启 X 会话
newgrp - docker
注意:最后一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。
运行docker测试
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
出现以上页面就安装成功啦
Docker常用命令
启动与停止
# 启动docker
$ sudo service docker start
# 停止docker
$ sudo service docker stop
# 重启docker
$ sudo service docker restart
列出本地镜像
$ docker images
- REPOSITORY:镜像所在的仓库名称
- TAG:镜像标签
- IMAGEID:镜像ID
- CREATED:镜像的创建日期(不是获取该镜像的日期)
- SIZE:镜像大小
为了区分同一个仓库下的不同镜像,Docker 提供了一种称为标签(Tag)的功能。每个 镜像在列出来时都带有一个标签,例如latest、 12.10、12.04 等等。每个标签对组成特定镜像的一 些镜像层进行标记(比如,标签 12.04 就是对所有 Ubuntu12.04 镜像层的标记)。这种机制 使得同一个仓库中可以存储多个镜像。
我们在运行同一个仓库中的不同镜像时,可以通过在仓库名后面加上一个冒号和标签名 来指定该仓库中的某一具体的镜像,例如 docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash,表明从镜像 Ubuntu:12.04 启动一个容器,而这个镜像的操 作系统就是 Ubuntu:12.04。在构建容器时指定仓库的标签也是一个好习惯。
搜索镜像
$ docker search pytorch
找AUTOMATED 有ok的下载
下载镜像
$ docker pull mapler/pytorch-cpu
删除本地镜像
$ docker image rm 镜像名或者id
# docker rmi 镜像名或id 这个方法也可以
# 注:当删除不了镜像,先把占用镜像的容器全部删除 docker rm 容器id
镜像备份与迁移
我们可以通过save命令将镜像打包成文件,拷贝给别人使用
docker save -o 保存的文件名 镜像名
例如
docker save -o ./ubuntu.tar ubuntu
在拿到镜像文件后,可以通过load方法,将镜像加载到本地
docker load -i ./ubuntu.tar
Docker容器操作
创建容器
$ docker run [option] 镜像名 [向启动容器中传入的命令]
常用可选参数说明
- -i 表示以“交互模式”运行容器
- -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
- –name 为创建的容器命名
- -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
- -d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
- -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
- -e 为容器设置环境变量
- –network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
交互式容器
例如,创建一个交互式容器,并命名为myubuntu
docker run -it --name=ubuntu --network=host hackeryx/ubuntu:16.04 /bin/bash
在容器中可以随意执行linux命令,就是一个ubuntu的环境,当执行exit命令退出时,该容器也随之停止。
守护式容器
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。在容器内部exit退出时,容器也不会停止。
docker run -itd --name=ubuntu2 --network=host hackeryx/ubuntu:16.04
进入已运行的容器
docker exec -it 容器名或容器id [进入后执行的第一个命令]
# 例如
docker exec -it ubuntu /bin/bash # bash交互模式
常用重启快捷键
# 退出容器且关闭, docker ps 查看无
ctrl+d
# 退出容器但不关闭,还能重新进入
ctrl+p+q
查看容器
# 列出本机所有容器,包括已经终止运行的
docker ps -a
停止与启动容器
# 停止一个已经在运行的容器
docker container stop 容器名或容器id
# 启动一个已经停止的容器
docker container start 容器名或容器id
# kill掉一个已经在运行的容器
docker container kill 容器名或容器id
删除容器
docker container rm 容器名或容器id
将容器保存为镜像
docker commit 容器名 镜像名
打包自己的镜像
创建一个文件夹(文件名任意)
mkdir docker_img
在这个文件夹下面有两个文件
- 自己需要部署的项目文件
- Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,就可以创建我们所需要的镜像
Dockerfile文件内容如下:
#基于的基础镜像,这里可以基于多个镜像,包括项目需要的环境,
FROM python:3.5
FROM continuumio/anaconda3
#代码添加到code文件夹
ADD ./crnn_chinese /code
# 设置code文件夹是工作目录,/code就变成了项目的一级目录
WORKDIR /code
# 安装支持,如果需要安装一些项目需要的包就在项目文件夹中新建这个txt文件,里面是包名与版本号,如下图所示
RUN pip install -r requirements.txt
# 最后一条命令,就是说,当启动容器时候,执行test.py程序。即一启动容器就执行这个命令
CMD ["python", "/code/test.py"]
创建镜像
docker build -t docker_img.
- -t 可选参数,镜像的名字及标签
- docker_img 为创建镜像的名称
- .表示当前目录
成功创建
一些常见问题
解决docker容器中文乱码
临时方法(退出容器后失效)
上传项目文件到服务器之后,出现中文乱码问题。
原因:docker容器当面编码格式不支持中文POSIX
locale -a查看容器所有语言环境
使用命令:apt-get -y install language-pack-zh-hans
然后增加中文编码集:(临时的,退出失效)
使用命令:export LANG=zh_CN.UTF-8
有了中文语言包。locale -a :
永久修改
# 修改Dockerfile
# 在Dockerfile中添加一行,重新制作docker镜像
ENV LANG C.UTF-8
docker挂载本地目录和数据卷容器
docker挂载本地目录
# docker可以支持把一个宿主机上的目录挂载到镜像里。
# 交互模式运行
docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash
# 后台运行
docker run -d -v /home/dock/Downloads:/usr/Downloads --name ubuntu1 ubuntu64
# 通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。
# 现在镜像内就可以共享宿主机里的文件了。
#默认挂载的路径权限为读写。如果指定为只读可以用:ro
docker run -it -v /home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash
docker数据卷容器
# docker还提供了一种高级的用法。叫数据卷。
# 数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。
# 示例:
docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash
# 创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。
# 再创建一个新的容器,来使用这个数据卷。
docker run -it --volumes-from dataVol ubuntu64 /bin/bash
# --volumes-from用来指定要从哪个数据卷来挂载数据。
# 这样在新创建的容器里/usr/Downloads目录会和宿主机目录/home/dock/Downloads同步
nvidia-docker的使用。
==nvidia-docker的使用与docker命令一致,需要使用cuda时则使用nvidia-docker进行打包与运行。