默认配置下, 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
-H 是用来指定服务器主机,info子命令用于查看docker服务器的信息
3、Docker Image
Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将Docker镜像看成只读模板,通过它可以创建Docker容器。
镜像有多种生成方法:
-
从无到有开始创建镜像
-
下载并使用别人创建好的现成的镜像
-
在现有镜像上创建新的镜像
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文本文件称作Dockerfile,通过执行docker build命令可以构建出docker镜像。
4、Docker Registry
Docker Registry是存储Docker Image的仓库,它在Docker生态环境中的位置如下图所示:
运行Docker Push、Docker pull、Docker search时,实际上是通过 Docker Daemon与 Docker registry通信。
5、Docker Container
Docker容器就是Docker镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。Docker Container提供了系统硬件环境,我们可以使用Docker Image这些制作好的系统盘,再加上我们编写好的项目代码,run一下就可以提供服务了。
五、Docker组件如何协作运行容器
容器启动过程如下:
-
Docker客户端执行docker run命令
-
Docker Daemon发现本地没有hello-world镜像
-
Daemon从Docker Hub下载镜像
-
下载完成,镜像hello-world被保存到本地
-
Docker Daemon启动容器
具体过程可以看如下这幅演示图:
我们可以通过Docker Image可以查看到hello-world已经下载到本地
六、Docker常用命令
我们可以通过docker -h去查看命令的详细的帮助文档。在这里我只会讲一些平常日常比赛或者生活中我们可能会用的比较多的一些命令。
例如,我们需要拉取一个docker镜像,我们可以用如下命令:
docker pull image_name
image_name为镜像的名称,而如果我们想从Docker Hub上去下载某个镜像,我们可以使用以下命令:
docker pull centos:latest
centos:lastest是镜像的名称,Docker daemon发现本地没有我们需要的镜像,会自动去Docker Hub上去下载镜像,下载完成后,该镜像被默认保存到/var/lib/docker目录下。
接着我们如果想查看下主机下存在多少镜像,我们可以用如下命令:
docker images
我们要想知道当前有哪些容器在运行,我们可以用如下命令:
docker ps -a
-a是查看当前所有的容器,包括未运行的
我们该如何去对一个容器进行启动,重启和停止呢?我们可以用如下命令:
docker start container_name/container_id
docker restart container_name/container_id
docker stop container_name/container_id
这个时候我们如果想进入到这个容器中,我们可以使用attach命令:
docker attach container_name/container_id
那如果我们想运行这个容器中的镜像的话,并且调用镜像里面的bash,我们可以使用如下命令:
docker run -t -i container_name/container_id /bin/bash
那如果这个时候,我们想删除指定镜像的话,由于image被某个container引用(拿来运行),如果不将这个引用的container销毁(删除),那image肯定是不能被删除。我们首先得先去停止这个容器:
然后我们用如下命令去删除这个容器:
docker ps
docker stop container_name/container_id
然后这个时候我们再去删除这个镜像:
docker rmi image_name
此时,常用的Docker相关的命令就讲到这里为止了,我们在后续的文章中还会反复地提到这些命令。
七、Dockerfile
Dockerfile是自动构建docker镜像的配置文件,用户可以使用Dockerfile快速创建自定义的镜像,Dockerfile中的命令非常类似于Linux下的shell命令。
我们可以通过下面这幅图来直观地感受下 Docker 镜像、容器和 Dockerfile 三者之间的关系。
我们从上图中可以看到,Dockerfile可以自定义镜像,通过Docker命令去运行镜像,从而达到启动容器的目的。
Dockerfile 是由一行行命令语句组成,并且支持已#开头的注释行。
一般来说,我们可以将Dockerfile分为四个部分:
-
基础镜像(父镜像)信息指令FROM
-
维护者信息指令MAINTAINER
-
镜像操作指令RUN、EVN、ADD和WORKER等
-
容器启动指令CMD、ENTRYPOINT和USER 等
下面是一段简单的Dockerfile的例子:
1、从Docker Hub上pull下python 2.7的基础镜像
2、显示维护者的信息
3、copy 当前目录到容器中的/app目录下 复制本地主机的(Dockerfile所在目录的相对路径)到容器里
4、指定工作路径为/app
5、安装依赖包
6、暴露5000端口
7、启动app
这个例子是启动一个Python flask app的Dockerfile(flask是Python的一个轻量级的web框架),相信大家从这个例子中能够稍微理解了Dockerfile的组成以及指令的编写过程。
八、构建Dockerfile代码实例
mkdir static_web
cd static_web
touch Dockerfile
然后 vi Dockerfile 开始编辑该文件
输入 i 开始编辑
以下是我们构建的Dockerfile内容
FROM nginx
MAINTAINER Angel_Kitty angelkitty6698@gmail.com
RUN echo ‘
Hello, Docker!
’ > /usr/share/nginx/html/index.html编辑完后 按 esc 退出编辑
然后 :wq 写入 退出
我们在Dockerfile文件所在目录执行:
docker build -t angelkitty/nginx_web:v1 .
我们解释一下,-t是为新镜像设置仓库和名称,其中angelkitty为仓库名,nginx_web为镜像名,:v1为标签(不添加为默认latest)
我们构建完成之后,使用docker images命令查看所有镜像,如果存在REPOSTORY为nginx和TAG是v1的信息,就表示构建成功。