Ubuntu16.04环境下Docker搭建与使用
- 一.Docker架构
- Docker核心组件
- 二.Docker安装
- 三.Docker常用命令
- 四.Dockerfile详解
- 五.Dockerfile常用指令
- 六.Systemd指令
一.Docker架构
Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。
Docker核心组件
1、Docker Client:Docker客户端是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。相当于Docker命令
2、Docker daemon:服务器组件是 Docker 最核心的后台进程,我们也把它称为守护进程。负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求。
(1) Docker Server:接受Docker Client请求
(2) Engine:处理请求
(3) Job:根据请求类型创建相应Job
启动Daemon:docker --daemon = true或docker –d或docker –d = true
Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。
(1) 编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service ,在环境变量 ExecStart后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。
(2) 重启 Docker daemon:systemctl daemon-reload或systemctl restart docker.service
(3) 通过以下命令即可实现与远程服务器通信:docker -H 服务器IP地址 info
3、Docker Image:Docker可以看做一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。只读模板,通过镜像创建Docker容器。
4、Docker Registry:存储 docker image 的仓库,执行push,pull,search等操作
5、Docker Container:Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。用run提供服务。
二.Docker安装
更新apt包索引:
sudo apt-get update
安装以下包以使apt可以通过HTTPS使用存储库(repository):
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加Docker官方的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
使用下面的命令来设置stable存储库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再更新一下apt包索引:
sudo apt-get update
安装最新版本的Docker CE:
sudo apt-get install -y docker-ce
查看docker版本以及是否安装完成:
查看docker服务是否启动:
systemctl status docker
若未启动,则启动docker服务:
sudo systemctl start docker
经典的hello world:
sudo docker run hello-world
具体的实现步骤:
(1) Docker 客户端执行 docker run 命令
(2) Docker daemon 发现本地没有 hello-world 镜像
(3) daemon 从 Docker Hub 下载镜像
(4) 下载完成,镜像 hello-world 被保存到本地
(5) Docker daemon 启动容器
三.Docker常用命令
1、 需要拉取一个 docker 镜像:docker pull image_name
下载完成后,该镜像被默认保存到 /var/lib/docker 目录下。
2、 查看下主机下存在多少镜像,我们可以用如下命令:docker images
3、 知道当前有哪些容器在运行,我们可以用如下命令:docker ps -a
-a 是查看当前所有的容器,包括未运行的
4、 对容器进行启动,重启和停止:
docker start container_name/container_id
docker restart container_name/container_id
docker stop container_name/container_id
5、 进入某个容器中:
docker attach container_name/container_id
6、 运行这个容器中的镜像,并且调用镜像里面的 bash:
docker run -t -i container_name/container_id /bin/bash
7、 删除容器:
docker rm container_name/container_id
8、 删除镜像:
docker rmi image_name
9、 后台运行容器:
docker run -d container_name/container_id
10、端口映射:
docke run -d -p 8080(主机端口):80(容器端口) container_name/container_id
11、随机端口映射:
docke run -d -P container_name/container_id
Docke网络:
1、 网络累计:Bridge(校接),Host,None
2、 端口映射:将主机端口和容器端口通过网桥映射
四.Dockerfile详解
Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 linux 下的 shell 命令。
1、 基础镜像(父镜像)信息指令 FROM:FROM 是用于指定基础的 images ,一般格式为 FROM <image> or FORM <image>:<tag>
2、 维护者信息指令 MAINTAINER:用于指定镜像创建者和联系方式,一般格式为MAINTAINER <name>
3、 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等:
4、 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
5、 例子:
FROM python:2.7
MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]
(1) 从 Docker Hub 上 pull 下 python 2.7 的基础镜像
(2) 显示维护者的信息
(3) copy 当前目录到容器中的 /app 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里
(4) 指定工作路径为 /app
(5) 安装依赖包
(6) 暴露 5000 端口
(7) 启动 app
五.Dockerfile常用指令
1、 FROM:用于指定基础的 images ,一般格式为 FROM <image> or FORM <image>:<tag>
,所有的 Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像。
2、 MAINTAINER:用于指定镜像创建者和联系方式,一般格式为 MAINTAINER <name>
。
3、 COPY:用于复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。当使用本地目录为源目录时,推荐使用 COPY 。一般格式为 COPY <src><dest>
。
4、 WORKDIR:用于配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/。一般格式为WORKDIR /path/to/work/dir
。
5、 RUN:用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为 RUN <command>
。
6、 EXPOSE:用来指定对外开放的端口。一般格式为 EXPOSE <port> [<port>...]
7、 ENTRYPOINT:让容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。
ENTRYPOINT 命令也有两种格式:ENTRYPOINT ["executable", "param1", "param2"]
:推荐使用的 exec形式ENTRYPOINT command param1 param2
:shell 形式
8、 CMD:用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。
CMD 命令有三种格式:CMD ["executable","param1","param2"]
:推荐使用的 exec 形式。CMD ["param1","param2"]
:无可执行程序形式CMD command param1 param2
:shell 形式。
一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。
构建Dockerfile:
(1) 写Dockerfile文件
(2) 搭建镜像到仓库:
在 Dockerfile 文件所在目录执行:docker build -t angelkitty/nginx_web:v1 .
-t 是为新镜像设置仓库和名称,其中 angelkitty 为仓库名, nginx_web 为镜像名, :v1为标签(不添加为默认 latest )
(3) 使用 docker run 命令来启动容器
docker run --name nginx_web -d -p 8080:80 angelkitty/nginx_web:v1
用 nginx 镜像启动一个容器,命名为 nginx_web ,并且映射了 8080 端口,这样我们可以用浏览器去访问这个 nginx 服务器:http://localhost:8080/ 或者 http://本机的IP地址:8080/
六.Systemd指令
systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。该命令可用于查看系统状态和管理系统及服务。
查看系统状态:
systemctl status
输出激活的单元:
systemctl
输出执行失败的单元:
systemctl –failed
查看全部已安装服务:
systemctl list-unit-files
马上激活单元:
systemctl start <单元>
马上停止单元:
systemctl stop <单元>
重新启动单元:
systemctl restart <单元>
又一次载入配置:
systemctl reload <单元>
输出单元执行状态:
systemctl status <单元>
检查单元是否配置为自己主动启动:
systemctl is-enabled <单元>
开机自己主动激活单元:
systemctl enable <单元>
取消开机自己主动激活单元:
systemctl disable <单元>
禁用一个单元(禁用后,间接启动也是不可能的):
systemctl mask <单元>
取消禁用一个单元:
systemctl unmask <单元>