Docker 安装与常用命令


1.安装Docker
准备工作:
如果安装了旧版本的 docker,要先卸载掉
sudo apt-get remove docker docker-engine docker.io containerd runc
再安装一些辅助工具,都是比较基础的工具,很可能系统中已经安装了,可以再确认一遍

sudo apt-get update

sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common
上边命令中的 \ 表示命令还没有结束,下一行依然属于本命令。这样写,每个待安装的程序独自占一行,比较清晰,也完全可以写成比较紧凑的形式如下

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
下边开始正式安装 docker.

添加 docker 的官方 key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
确认一下

sudo apt-key fingerprint 0EBFCD88
应该返回如下的 key

pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) docker@docker.com sub 4096R/F273FCD8 2017-02-22
添加 docker repository
sudo add-apt-repository
“deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”
安装 docker
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io
上述方法默认安装最新的稳定版本 docker. 也可以安装某个特定的版本。
查看一下可安装的版本

apt-cache madison docker-ce
应该会显示如下的结果

docker-ce | 5:18.09.13-0ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 5:18.09.03-0ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 18.06.1ce3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 18.06.0ce3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

假如要安装 18.09.0 这个版本,就用如下命令

sudo apt-get install docker-ce=5:18.09.03-0ubuntu-xenial docker-ce-cli=5:18.09.03-0ubuntu-xenial containerd.io
确认安装成功
用如下命令运行 hello-world image
sudo docker run hello-world
通过显示的信息可以确认是否安装成功。

设置用户权限
用上述方案安装好 docker 之后,每次运行 docker 都需要 sudo 权限,比较麻烦,可以再进一步设置一下免 sudo 运行
sudo groupadd docker # 创建 docker 用户组

sudo usermod -aG docker $USER # 将当前用户添加进去
然后 log out 再 log in, 不需要 sudo 就可以运行 docker 了。

Docker 常用命令
在最初的时候, docker 的命令比较松散,没有条理。后来可能感觉这样定义命令不太好记,就引入了新的命令格式,将原本比较松散的命令归类整理起来,整理之后的命令示例

docker container ls == docker ps # 列出 container

docker container rm … == docker rm … # 删除 container

docker image rm … == docker rmi … # 删除 image
也就是把所有命令分门别类(例如关于 container 的,关于 image 的,关于 network 的等等)的组织起来,比较有条理。

image 相关
列出本地现有 image
docker image ls
删除 image
docker image rm image_name
下载 image
docker image pull image_name
默认从 docker 官网的 library 中下载对应名字的 image

container 相关
从 image 生成 container 实例
docker container run image_name
实际上, docker container run 可以自动抓取 image,如果本地没有 Image,就从网上仓库下载,因此前边的 docker image pull 命令也可以省略了。

老版本的命令

docker run image_name
有相同效果。

关闭一个 container
docker container kill container_ID
上述 kill 命令比较强烈,通过 docker 强制关闭 container。也可以用比较缓和的命令

docker container stop container_ID
向 container 发送关闭信号,让 container 自己决定如何恰当的关闭

由 image 生成的 container 实例本身也是文件,称为容器文件。也就是说,一旦容器生成,就应该存在两个文件,一个是 image 文件,一个是容器文件。关闭正在运行的容器 (在不附加额外参数的情况下) 并不会删除容器文件,只是退出运行而已,而且保留了在容器运行过程中的修改。

列出已有 container
docker container ls
上述命令只是列出正在运行的 container,如果把本机上所有的 container 都列出来,包括正在运行和已经关闭的,用如下命令:

docker container ls --all
运行已经存在的 container
docker container start container_ID
删除 container
docker container rm container_name (或 container_ID)
也可以在运行 image 产生 container 的时候就加上 --rm 参数,告诉 docker 只要这个 container 一退出,就删除它。所以可以见到很多如下格式的命令:

docker run -it --rm …
–rm 就是为了自动删除 container.
-i : interactive 表示可以与 container 交互,输入命令
-t : pseudo terminal 提供交互的 terminal 界面

所以如下命令就是进入 container 的交互环境中(运行 bash)

docker container run -it image_name /bin/bash
从 运行的 container 中拷贝文件到本机
docker container cp container_ID:path_to_file host_path
进入一个正在运行的 container
docker container exec -it container_ID /bin/bash (或者只写 bash)
后台运行 container
docker container run -d image_name
network 相关
安装好 docker 之后,可以查看现有的 network

docker network ls
一般会有三个 network

NETWORK ID NAME DRIVER SCOPE
c749b1b83091 bridge bridge local
a23ca96b3291 host host local
74d0c66e9190 none null local
如果在运行 container 时不设定 network,则默认是第一个 bridge network. 此时,如果 container expose 某个 port,例如 8080,则 bridge network 中的其他程序可以通过这个 port 与它通信。如果 host network 中程序想与它通讯,必须设置一个端口映射 -p 5000:8080,这样所有与 host network 5000 端口通讯的都可以被映射到 container 的 8080 端口。

也可以让 container 直接运行在 host network 中,这就是为什么在很多运行 image 的命令中,都有 --net=host 设置。这样的话,就可以直接通过 host 的端口进行通讯了,不需要桥接映射。

文件共享
很多情况下, container 中程序产生的数据需要拿到 host 中进行分析,这就涉及到两个环境之间的文件共享问题。

在运行 image 的时候,可以用 -v /host_path:/container_path 来设置两个系统之间的共享文件夹。
例如

docker run -v ~/shared_files:/home/docker_user/log_files image_name