背景
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0
协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
docker 安装
Docker
的旧版本被称为 docker
,docker.io
或 docker-engine
。如果已安装,请卸载它们:
sudo apt-get remove docker docker-engine docker.io containerd runc
首先安装依赖:
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
添加信任 Docker 的 GPG 公钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
对于 amd64 架构的计算机,添加软件仓库:
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
最后安装
sudo apt-get update
sudo apt-get install docker-ce
docker --version
## Docker version 19.03.11, build 42e35e61f3
Hello world
Docker
允许你在容器内运行应用程序, 使用 docker run
命令来在容器内运行一个应用程序。
docker run ubuntu:15.10 /bin/echo "Hello world"
## hello world
参数解析:
- docker : Docker 的执行命令
- run : 与
docker
命令组合运行一个特定的容器 - ubuntu:15.10 : 指定要运行的镜像,
Docker
首先从本地主机上查找镜像是否存在,如果不存在,Docker
就会从镜像仓库Docker Hub
下载公共镜像。 - /bin/echo “Hello world” : 在启动的容器里执行的命令
连起来就是:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
交互运行
ubuntu@VM-0-11-ubuntu:~$ sudo docker run -i -t ubuntu:15.10 /bin/bash
root@2401df9ef044:/#
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入进行交互。
通过运行 exit
命令或者使用 CTRL+D
来退出容器。
后台运行
ubuntu@VM-0-11-ubuntu:~$ sudo docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
9db349c972802d3a7627b27d3c9eb0c58888ad0c80a001b5d7e6f08813eed876
输出的长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么
可以通过 docker ps
来查看容器的运行情况
ubuntu@VM-0-11-ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9db349c97280 ubuntu:15.10 "/bin/sh -c 'while t…" 11 seconds ago Up 10 seconds tender_black
输出详情介绍:
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS: 容器状态。
- PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
- NAMES: 自动分配的容器名称。
docker 运行有七种状态
- created(已创建)
- restarting(重启中)
- running(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
使用docker logs
查看输出结果
ubuntu@VM-0-11-ubuntu:~$ sudo docker logs tender_black
hello world
使用docker stop
停止容器
ubuntu@VM-0-11-ubuntu:~$ sudo docker stop tender_black
tender_black
docker 用户
docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。
解决方案:
- 使用sudo获取管理员权限,运行docker命令
- docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用