Docker 的安装和使用

安装 dcoker

ubuntu 16.04 (LTS) 安装 docker

参考官网安装方法 https://docs.docker.com/engine/install/ubuntu/

卸载旧版本

$ sudo apt-get remove docker docker-engine docker.io containerd runc

镜像仓库方式安装

设置镜像仓库
# 更新 apt 软件包索引:
$ sudo apt-get update
# 安装软件包,以允许 apt 通过 HTTPS 使用镜像仓库:
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 添加 Docker 的官方 GPG 密钥:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 验证密钥指纹是否为 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88。
$ sudo apt-key fingerprint 0EBFCD88

# 设置 stable 镜像仓库
# amd64:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

使用国内源

# 更换国内软件源,推荐中国科技大学的源
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
$ sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
$ sudo apt update
# 安装需要的包
$ sudo apt install apt-transport-https ca-certificates software-properties-common curl
# 添加 GPG 密钥,并添加 Docker-ce 软件源,这里还是以中国科技大学的 Docker-ce 源为例
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
# 添加成功后更新软件包缓存
$ sudo apt update
# 安装 Docker-ce
$ sudo apt install docker-ce
安装 DOCKER CE
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# 安装指定版本
$ apt-cache madison docker-ce

docker-ce | 5:18.09.1~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 5:18.09.0~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.06.0~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.03.1~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
...

$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

启动 docker daemon
否则会报错:docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See ‘docker run –help’.

$ sudo service docker start
# sudo systemctl enable docker
# sudo systemctl start docker

验证是否正确安装

$ sudo docker run hello-world

此命令将下载一个测试镜像并在容器中运行它。容器运行时,它将输出一条参考消息并退出

升级 docker ce

如需升级 Docker CE,首先运行 sudo apt-get update,然后按照顺序执行操作,并选择您要安装的新版本

卸载 docker ce
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io

主机上的镜像、容器、存储卷、或定制配置文件不会自动删除。如需删除所有镜像、容器和存储卷,请运行下列命令:

$ sudo rm -rf /var/lib/docker
将 docker 配置为在启动时启动

使用脚本安装

curl -sSL https://get.docker.com/ | sh

# 将用户添加到docker组,可以用非root用户使用docker
$ sudo usermod -aG docker <your-user>

国内的服务器可以使用如下脚本加速安装,

# 阿里云的安装脚本
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
# DaoCloud 的安装脚本
curl -sSL https://get.daocloud.io/docker | sh

centos 安装 docker

参考官网安装方法 https://docs.docker.com/engine/install/centos/

卸载旧版本(如果安装过旧版本的话)

$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的

$ sudo yum install -y yum-utils

设置 yum 源

$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

安装

$ sudo yum install docker-ce

# 可以查看所有仓库中所有 docker 版本,并选择特定版本安装
$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

# 启动 Docker,设置开机启动,停止 Docker
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo systemctl stop docker

卸载

$ sudo yum remove docker-ce docker-ce-cli containerd.io
$ sudo rm -rf /var/lib/docker

常见问题

# 报错:Requires: container-selinux >= 2:2.74
You could try using --skip-broken to work around the problem

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum install epel-release # 阿里云上的 epel 源
$ yum makecache
$ yum install container-selinux
# Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

卸载 docker 重新安装

使用 docker

配置镜像加速

修改 docker 源

修改配置文件 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Window)

如果没有新建一个

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

重启 docker

安装镜像

安装 Ubuntu 镜像

docker search ubuntu # 查找 Ubuntu 镜像
docker pull ubuntu # 安装 Ubuntu 镜像
docker images #查看 docker 镜像

# 创建并运行 docker 容器
docker run -it -d --name ubuntu_test -p 8088:80 ubuntu
# --name 自定义容器名,-p 指定端口映射,前者为虚拟机端口,后者为容器端口,成功后返回 id
# 多个 -p 指定多个端口映射

# 运行 docker 容器 启动一个 bash 交互终端
docker run -it 容器名:容器tag /bin/bash

docker start container_id


# 查看所有启动的容器(查看所有容器加 -a)
docker ps

# 根据 id 查看容器信息
docker inspect id

# 进入docker(或者把容器id改为容器名,也可以进入)
docker exec -it 容器id或容器名 /bin/bash

# OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown
# 解决
# docker exec -it 容器id或容器名 /bin/sh
# docker exec -it 容器id或容器名 bash
# docker exec -it 容器id或容器名 sh

# 退出容器
exit

# 停止容器
docker stop id

# 删除容器
docker rm 容器id

# 删除镜像
docker rmi 删除镜像

备份镜像

# 制作 docker 镜像  1.0 为版本号
docker commit 98 my-ubuntu:1.0

# 查看镜像是否创建
docker images

# 保存镜像到 docker 账号中
# 登录进 Docker 注册中心
docker login

# 推送镜像
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag my-ubuntu:1.0 cuilongjin/my-ubuntu:1.0
docker push cuilongjin/my-ubuntu:1.0

# 打包镜像并查看
docker save -o my-ubuntu.tar my-ubuntu:1.0

恢复容器

# 从docker账号中拉取
docker pull cuilongjin/my-ubuntu:1.0

# 从本地
docker load -i ~/my-ubuntu.tar

# docker images

# 用加载的镜像去运行Docker容器
docker run -d -p 80:80 my-ubuntu

docker 给已存在的容器添加或修改端口映射

方式 1:

提交一个运行中的容器为镜像

$ docker commit containerid foo/live

运行镜像并添加端口

$ docker run -d -p 8000:80  foo/live /bin/bash

方式 2:iptable 转发端口

将容器的 8000 端口映射到 docker 主机的 8001 端口

$ iptables -t nat -A  DOCKER -p tcp --dport 5001 -j DNAT --to-destination 45.77.150.20:8000

docker 容器使用问题

Centos7 docker 容器报 docker Failed to get D-Bus connection 错误

$ systemctl start nginx
Failed to get D-Bus connection: Operation not permitted。

原因是 dbus-daemon 没能启动

解决方法

docker run -it -d --name ubuntu_test -p 8088:80 ubuntu
$ docker run --privileged -ti --name test1 centos /usr/sbin/init

ssh 链接 docker 容器

进入容器

安装依赖

yum install passwd openssl openssh-server openssh-clients -y

安装 service 命令:

yum install initscripts -y

修改密码:

passwd

修改配置:

vi /etc/ssh/sshd_config

PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径

PermitRootLogin yes #root 能使用 ssh 登录

重启 ssh 服务,并设置开机启动:

service sshd restartchkconfig sshd on

如果无法执行,可试着执行:

systemctl start sshd.service systemctl enable sshd.service

service sshd restart

运行 docker exec -it 容器 /bin/bash 出现如下错误

OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

解决方式:尝试使用如下命令

sudo docker exec -it 容器 /bin/sh
sudo docker exec -it 容器 bash

docker-compose

如果你想要通过 docker-compose 统一管理你的 Docker container,这里也可以安装一下

官方文档:https://docs.docker.com/compose/install/

sudo curl -L https://github.com/docker/compose/releases/download/1.26.2/run.sh > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

使用 pip 安装

pip install docker-compose

运行一下 docker-compose version 来检测一下是否成功

创建配置文件

创建一个名为 docker-compose.yml 的配置文件

version: '3'
services:
v2ray1:
image: v2fly/v2fly-core # 镜像名称
container_name: v2ray # 容器名称
restart: always
command: v2ray -config=/etc/v2ray/config.json # 覆盖容器启动后默认执行的命令
ports:
# HOST:CONTAINER
- '44222:44222' # 端口
#- "127.0.0.1:8889:8889"
volumes:
# HOST:CONTAINER
- ./config:/etc/v2ray # 目录
#- /etc/v2ray/v2ray.crt:/etc/v2ray/v2ray.crt
#- /etc/v2ray/v2ray.key:/etc/v2ray/v2ray.key

v2ray2:
build:
context: ./dir # context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url
dockerfile: path/of/Dockerfile # 使用此 dockerfile 文件来构建,必须指定构建路径

命令

以下命令需要在 docker-compose.yml 所在目录下执行

docker-compose up -d # 部署 v2ray
docker-compose start v2ray # 启动 v2ray
docker-compose stop v2ray # 停止 v2ray
docker-compose restart v2ray # 重启 v2ray
docker stop v2ray && docker rm v2ray # 删除 v2ray
docker-compose pull && docker-compose up -d # 更新 v2ray