Docker
Docker 是什么?
Docker 是一种虚拟化的容器,隔离了文件系统、网络互联和进程等等,但比之传统的虚拟化技术,精简了内核和硬件的虚拟,容器内的应用进程直接运行在宿主内核。
安装
macOS
(1)Homebrew 安装
> brew cask install docker
(2)下载安装
Ubuntu 16+
(1)测试环境使用一键自动安装脚本
> curl -fsSL get.docker.com -o get-docker.sh
> sudo sh get-docker.sh --mirror Aliyun
(2)按部就班安装
# 添加使用 HTTPS 传输的软件包以及 CA 证书
> sudo apt-get update
> sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
# 添加软件源的 GPG 密钥
> curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 向 source.list 中添加 Docker 软件源
> sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 安装 docker-ce
> sudo apt-get update
> sudo apt-get install docker-ce
Amazon Linux
# 更新实例上已安装的程序包和程序包缓存
sudo yum update -y
# 安装最新的 Docker Community Edition 程序包
sudo yum install -y docker
# 启动 Docker 服务
sudo service docker start
# 将 ec2-user 添加到 docker 组,以便您能够执行 Docker 命令,而无需使用 sudo
sudo usermod -a -G docker ec2-user
# 重新登录
# 验证 ec2-user 是否能在没有 sudo 的情况下运行 Docker 命令
docker info
检查安装情况
> docker --version
> docker-compose --version
> docker-machine --version
使用镜像加速器
鉴于国内的网络情况,拉取镜像会很慢,这时候需要配置镜像加速器,使用国内的镜像服务器。
国内的镜像服务器地址: https://registry.docker-cn.com。
配置方式:对于使用 Docker 客户端的用户,依次点击 Docker 图标 --> Settings/ Perferences --> Daemon --> Registry mirrors
,输入加速器地址,然后点击 Apply & Restart 即可。
检查配置是否生效:执行 docker info
查看 Registry Mirrors
字段的值。
启动和停止
Mac
跟启动普通软件的方式一样。
Ubuntu 16+
> sudo systemctl enable docker
> sudo systemctl start docker
快速开始:启动一个 Nginx 服务器
(1)安装并启动一个 Nginx 服务器,将本地的 8080 端口映射到 Docker 的 80 端口。
> docker run -d -p 8080:80 --name webserver nginx
(2)通过 docker ps
查看运行中的 docker 容器列表。
(3) curl http://localhost:8080
。
(4)停止 Nginx 服务器
> docker stop webserver
(4)从 Docker 中删除 Nginx 服务器
> docker rm webserver
基本概念
镜像(Image)
虚拟概念,并非一个 ISO 的压缩文件,而是使用 Union FS 分层存储技术存储的多层文件系统联合组成,存放的是 root
文件系统,包括容器运行时所需的程序、库、资源、配置等文件,但不包含动态数据。
容器(Container)
容器是镜像运行时的实体,实质就是一个个的 Docker 进程,可以对 Docker 进程进行如下操作:
- 创建
- 启动
- 停止
- 删除
- 暂停
容器也采用分层存储(最多有127层),容器运行时,以镜像为基础层,在其上创建一个当前容器的存储层,称之为容器存储层。容器存储层的生命周期与容器同步,故不应向存储层写入任何数据,所有的文件写入操作,都应使用数据卷(Volume)或者绑定宿主目录。
Registry
用来集中存储和分发 Docker 镜像的服务,一个 Registry 可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
常用的 Public Registry 列表:
国内针对 Docker Hub 的镜像服务(加速器)有:
命令
镜像相关
命令 | 功能 |
---|---|
docker images | 列出所有拉取的镜像 |
docker inspect [name] | 检视镜像的详细信息 |
docker rmi [REPOSITORY]:[TAG] | 删除镜像 |
docker pull [name] | 拉取镜像 |
首先在 https://hub.docker.com/?namespace=lshare 上注册并创建仓库 docker login --username=username docker tag local-image:tagname reponame:tagname docker push reponame:tagname docker pull registry.hub.docker.com/lshare/hello:v1 |
发布镜像 |
容器相关
命令 | 功能 |
---|---|
docker ps -a | 列出所有容器及其状态 |
docker ps | 列出所有运行中的容器 |
docker rm [容器 ID] | 删除容器 |
docker crate -it [镜像标签或镜像 ID] | 新建一个容器 |
docker start [容器 ID] | 运行处于终止状态的容器 |
docker kill [容器 ID] | 强制终止容器 |
docker kill [容器 ID] | 停止容器 |
docker restart [容器 ID] | 重启一个容器 |
docker logs [容器ID] | 查看容器日志 |
更进一步
命令 | 功能 |
---|---|
docker exec -ti [容器ID] /bin/bash | 进入具体容器中运行交互命令 |
docker exec [容器 ID 或容器 name] 具体命令 | 直接执行具体容器的命令 |
Dockerfile
Dockerfile 用来定制镜像,是一组指令,描述如何在基础镜像中一步步构建自定义的镜像。下面以修改 nginx 服务器首页为例:
(1)新建名为 Dockerfile
的文件,内容如下:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
(2)使用 docker build
开始构建
# 确保在 Dockerfile 所在的目录下执行该命令,
# 否则需要使用 `-f [file_name]` 指定 Dockerfile
# 使用 `-t [name:tag]` 指定镜像的名称和标签
docker build -t nginx:v3 .
命令解析
(1)FROM
指定基础镜像。
(2)RUN
执行命令行命令,支持 shell 格式和 exec 格式。
注意:Dockerfile 每个指令都会建立一层,Union FS 有最大层数限制。多个命令行指令可以使用
&&
串联。
Docker Compose
Docker Compose 是 Docker 官方的开源项目之一,用来快速地部署分布式应用。官方定位是「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」。衍生概念有:
- 服务(Service), 一个 Docker 容器称之为一个服务;
- 项目(Project),一个 Compose,或者说一组相关联的服务,称之为一个项目 。
安装
Docker Compose 在 Docker 客户端中已经包含,可以直接使用。
# 检查是否可用
docker-compose --version
快速开始
(1)使用 Dockerfile
定义应用的环境;
(2)使用 docker-compose.yml
定义组成应用的各项服务;
(2)执行 docker-compose up
进行部署。
排错
Error: Cannot Start Container: stat /bin/sh: no such file or directory”
(1)使用 docker inspect
检视镜像的 Cmd
选项;
(2)如果 Cmd
中不包含 /bin/sh
那意味着可能被你重写了。
permission denied while trying to connect to the Docker daemon socket
(1)默认情况下,docker
命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root
用户和 docker
组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root
用户。因此,更好地做法是将需要使用 docker
的用户加入 docker
用户组。
> sudo usermod -aG docker $USER
接着重启 docker,并新开一个会话连接。
(2)如果还是不行,那么只好使用 sudo
运行 docker 命令了。
参考
- Docker -- 从入门到实践(绝佳的入门文档)
- docker-library/docs - Github (docker 官方镜像的使用文档)