Docker在 CentOS7.X上运行。Docker可能在其他EL7的兼容版本中成功安装,但是官方并未进行测试,因此也不提供任何支持。
系统环境要求
docker必须运行在64-bit的系统上,对于CentOS的版本号并没有特别要求。另外,如果需要在CentOS上安装,内核版本必须高于3.10。
通过uname -r 查看内核版本
uname -r
3.10.0-327.el7.x86_64
脚本安装
可以通过以下两种方法安装Docker Engine。使用 yum包管理器;
或者使用 curl命令访问 get.docker.com网站。后者将获得一个安装脚本,该脚本将通过yum管理器安装Docker。
[root@localhost ~]# curl https://get.docker.com|sh
#安装好之后在/etc/group 下,会有一个docker组
创建一个docker用户组
docker守护进程现在绑定了一个Unix Socket,取代了之前的TCP端口。 默认情况下,这个Socket的属主用户是root并且用户可以通过sudo进行访问。因此,docker守护进程总是通过root用户运行。
为了避免在使用docker命令的时候使用sudo,需要创建一个名为docker的Unix用户组,并给该用户组添加用户。当docker守护进程启动后,docker用户组的用户可以获得socket的的读写权限。
注意: docker用户组等效于root用户; 关于这样做为什么为影响你的系统安全,更多信息可以查看Docker Daemon Attach Surface。
为docker用户组添加用户
$ sudo usermod -aG docker your_username
重新登录
这样可以保证你的用户获得正确的权限
确认你可以不使用sudo启动docker容器
$ docker run hello-world
设置docker daemon为开机启动
确保docker会在开机时候启动,需要执行以下命令
sudo chkconfig docker on
# 或者
sudo systemctl enabld docker.service
#如果需要使用HTTP代理,那么需要为Docker执行文件另外设置一个目录或者分区,或者使用其他定制选项。阅读关于系统的文章并学习customize your Systemd Docker daemon options。
卸载
可以通yum 卸载docker软件
列出所有以及安装的程序包
$ yum list installed |grep docker
docker-engine.x86_64 1.12.1-1.el7.centos @dockerrepo
docker-engine-selinux.noarch 1.12.1-1.el7.centos @dockerrepo
删除软件包
$ sudo yum -y remove docker-engine.x86_64 1.12.1-1.el7.centos
该命令不会删除docker镜像,容器,数据卷,或者用户创建的配置文件。 +
如果要删除镜像,容器和数据卷,使用以下命令
$ rm -rf /var/lib/docker
查找并删除其他任意用户创建的配置文件。
使用yum安装
登录系统,并确认用户为root或者用户有权限使用sudo命令。
保证你现有的yum安装包是最新的。
sudo yum update
添加yum repo
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
安装docker
sudo yum install docker-engine
启动docker
sudo service docker start
/bin/systemctl stop docker.service
确认docker被正确安装并在容器中运行一个测试镜像(image)
$ sudo docker run hello-world (大小为1.84KB)
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an centos container with:
$ docker run -it centos bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
了解docker镜像与容器
docker引擎提供核心docker技术,从而实现镜像和容器。正如安装的最后一步,你执行docker run hello-world命令。这条命令分为三个部分:
镜像是在运行时使用的文件系统和参数构成的。他没有状态且还不会改变。
容器是镜像运行时的一个实例。当你执行命令时,Docker引擎会:
● 检查当前系统环境是否有hello-world软件镜像
● 如果没有则从Docker Hub上下载镜像
● 加载镜像到容器并“执行”他
根据构建方式的不同,一个镜像可能在执行一个简单的、单一的命令后退出。正如hello-world镜像。
一个docker镜像可以做事情还有很多。一个镜像可能启动一个例如数据库的复杂程序,并等待你(或其他人)添加、存储数据并在之后使用他;进而等待之后的人员继续使用。
Docker创建了 hello-world镜像,但是其他任何人也可以。Docker引擎允许其他人或公司通过镜像创建并分享软件。
使用docker时,你不用担心你的计算机是否能够运行镜像中的软件,在dock容器中,永远可以成功运行
容器中的Hello World
Docker允许你在容器中运行你创建的应用或其他任何东西。而运行一个应用只需要一个简单的命令: docker run ****
注意:跟你docker系统的配置,可能你需要使用 sudo才能执行docker命令。如果不想再使用sudo,可以将用户添加到docker用户组。
输出hello wolrd
$ docker run centos /bin/echo "hello world"
hello wolrd
#########启动了你的第一个容器##########
docker run 启动了一个容器。
Centos是这个容器使用的镜像。如果本地没有该镜像则会从DockerHub上下载。
镜像启动完成后,在容器内执行了 /bin/echo 命令。
这个容器启动后,Docker创建了一个新的centos系统环境并在容器内执行/bin/echo已经打印输出
hello world
启动一个可交互的容器
$ docker run centos (# pull centos系统)
$ docker run -t -i centos /bin/bash
[root@041024e7efea /]# pwd
/
[root@041024e7efea /]# cd /tmp
[root@041024e7efea tmp]# ls
ks-script-CIN_1i yum.log
[root@041024e7efea tmp]#
在本例中:
docker run启动了一个容器。
centos是使用的镜像。
-t 在容器内部注册了一个 pseudo-tty或者terminal。
-i 通过容器的标准输入[STDIN]建立了一个链接,允许你与容器进行交互
/bin/bash 在容器中启动 bash shell。
容器启动后,我们可以看到命令行提示为:
[root@3b39ca23e6c8 /]#
当需要结束是,使用 exit命令或 Ctrl+D退出交互shell。+
[root@3b39ca23e6c8 /]# exit
exit
[root@localhost ~]#
注意: 这里一旦结束了 bash shell进程,容器就停止了。
启动一个后台容器
$ docker run -d centos /bin/sh -c "while trus;echo hello world;sleep 1;done"
1864e7a169419b74a8c863f4e488461d54bf2f8fdcd8a41cd5a47ca23467fb53
-d 参数使容器在后台运行。
在输出中只是有一串很长的字符串
1864e7a169419b74a8c863f4e488461d54bf2f8fdcd8a41cd5a47ca23467fb53
这个字符串就是容器ID。 该字符串唯一标识一个容器的,可以通过该字符串操作容器。
注意:这个容器ID显然太长了。之后我们将使用更短的ID和方法标示容器。
可以使用这个容器ID查看hello wolrd做了什么。
首先, 需要确认容器正在运行。 使用命令 docker ps 查看。 该命令将引导docker进程列出所有已知容器的信息。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f8830d097b7 centos "/bin/sh -c 'while..." 11 minutes ago Up 11 minutes upbeat_noether
在本例中,可以看到处于后台运行的容器。 docker ps 另外返回了一些有用的信息:
1f8830d097b7 这是一个更短的容器ID。
Centos 是我们所使用的镜像。
另外还有容器启动后执行的命令,容器状态和容器名称。
注意:如果启动容器的时候不指定容器名称,那么docker会自动为容器分配一个。
确认了容器正在运行,但是容器是否按照我们要求在运行呢?
为了确认,我们可以使用 docker log命令观察容器内部。
$ docker logs upbeat_noether (upbeat_noether是上面的,往上看)
本例中:
docker log查看了容器的内部,并返回 hello world
docker还在后台运行。另外,你刚创建了你的第一个docker化的应用。
接下来使用 docker stop 命令关闭容器。 ( docker stop + 名字也可以关闭)
或者
使用 docker ps查看容器运行状态
Excellent. 所有容器都已经停止了。
运行一个简单的应用
在之前容器中的Hello World学习了如何使用 docker run启动容器。在前台运行了一个可交互容器;也可以在后台运行一个分离的容器。之前你习以下几个命令
docker ps 显示容器
docker logs 显示容器中的标准输出
docker stop 停止一个运行中的容器
学习如何使用docker客户端
可能你还没有意识到,你之前使用的在bash终端中输入的每一条docker命令都是在使用docker客户端。命令行客户端又被称为命令行接口(CLI)。你每一次执行的行为都是由docker命令和一些标记和参数组成。
例如:$ docker run -i -t ubuntu /bin/bash
使用命令 docker version 可以查看你当前使用的docker客户端和服务端版本信息。+
$ docker version
docker命令帮助信息
使用 --help 参数, 可以查看docker命令的帮助信息。 查询docker所有子命令,如下:
$ docker --help
查看具体子命令的帮助信息,则是在子命令后使用 --help 参数。
$ docker attach --help
注意:如果要了解更多命令的详细信息和用法,参考命令手册。
在docker中运行一个web应用
刚才又学习了一点关于docker客户端的用法,现在可以开始处理一些更做要的工作了:
启动更多的容器。到目前为止,你还没有启动任何一台有实际意义的容器,现在你可以运行一台我们预先准备的web应用。
提供的web应用镜像中,将运行一个 Python Flash 应用。 使用 docker run:
$ docker run -d -P training/webapp python app.py(是大P)
再来回顾一下该命令做了些什么。 使用了两个标记 -d 和 -P。
-d 是告诉docker后台运行容器;
-P则是告诉docker映射所有容器内部需要使用的网络端口到本地计算机,这让我们可以访问容器中的web应用。
指定使用镜像:training/webapp。 该镜像是一个创建好的镜像,容器中会运行一个简单的 Python Flash web应用程序。
最后, 你为容器指定了一个命令: python app.py命令会启动容器内的web应用。
注意: 你可以在 命令手册 和 docker run 手册 中查看更多关于 docker run 的信息。
查看web容器
现在你可以使用命令 docker ps 查看刚才启动的容器。
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a0be323ed56 training/webapp "python app.py" 54 seconds ago Up 53 seconds 0.0.0.0:32769->5000/tcp stupefied_hoover
注意:默认情况下, docker ps 只会显示正在运行的容器信息。使用 docker ps -a 则会显示所有容器信息,包括停止了的。
当我们使用 -P 标记时, docker run 命令会映射容器中使用的所有端口到本地计算机。
PORTS
0.0.0.0:32769->5000/tcp
注意:将在 如何创建镜像 中学习如何在镜像暴露(EXPOSE)端口。
在上面的案例中,docker将容器的5000端口(python flask的默认端口)映射到了本地计算机的49155端口上。
端口绑定是可配置的。在上一个案例中, -P 是 -p 5000 的缩写, 将容器内部的5000端口映射到本机计算机的高端口号(临时端口范围(ephemeral port range),通常为32768-61000)上。也可以使用 -p指定绑定的端口。
注意: -P local_port:container_port 前面是是本机计算机端口,后面是容器端口。 如果省略 local_port的话,则将使用随机高位端口。
例如:docker run -d -P 80:5000 training/webapp python app.py
#iptables -F
#setenforce 0
curl localhost:32769 ##linux端访问本地
http://192.168.0.18:32769/ ##win端访问
python应用成功运行了。可以在浏览器*问 http://192.168.0.18:32769 访问。
容器的5000端口将被映射到本机计算机的80端口上。你可能会问,那我们为什么不使用1:1对应的端口映射,而要映射到高端口号上?
1:1对应端口映射的局限在于本地计算机端口只能被映射一次,不能同时被重复映射。
试想一下你同时测试两个python应用,容器内部都使用5000端口。
在不使用docker端口映射的情况下,在同一时间内你只能访问一个docker容器。
快速查询端口映射
使用 docker ps 命令查询容器的端口映射信息有一点不方便。因此docker提供了一个有用的快捷方式: docker port。
使用 docker port 命令时,我们需要指定容器ID或名称以及需要进行通讯的的容器端口号。
本例中,你查询容器的5000端口映射到了本机计算机哪个端口上。
查看web应用的日志
也可以使用 docker logs 命令查看web引用发生了什么
查看容器内应用的进程信息
除了查看容器日志之外,还可以使用 docker top 命令查看容器内的进程信息:
[root@localhost ~]# docker top stupefied_hoover
UID PID PPID C STIME TTY TIME CMD
root 25912 25897 0 19:14 ? 00:00:01 python app.py
#这里我们看到,容器中只有一个进程。
检查容器内的应用信息
最后,将使用 docker inspect 命令获取docker容器初级信息。该命令将返回一个JSON文档,其中包含了指定容器配置和状态信息。
[root@localhost ~]# docker inspect stupefied_hoover
可以通过指定具体的元素查询信息,例如说,查询容器的IP地址:
停止一个运行的容器
已经看过web应用如何工作了,现在可以使用 docker stop container_name|container_id 命令停止容器。
启动一个停止的容器
在你停止了容器之后,你接到一个电话说另外一个程序员需要使用web应用。现在你有两个选择:
创建一个新的容器;
使用 docker start container_name|container_id 重启刚才关闭的容器。
注意: 也可以使用 docker restart container_name|container_id 命令停止并启动一个容器。
删除一个容器
当一个容器不再被使用的时候,可以通过 docker rm container_name|container_id 命令删除。
[root@localhost ~]# docker stop stupefied_hoover #先暂停
[root@localhost ~]# docker rm stupefied_hoover #再删除
#不能删除一个正在运行的容器,这样做的原因是防止删除时的误操作。因此在删除容器之前,你需要停止他。
现在容器已经被删掉了
注意: 永远记住 删除 是一个容器操作的最后操作
创建自定义镜像
docker images是容器的技术。每次使用 docker run 命令时都需要指定使用的镜像。之前的章节中使用的镜像都已经存在,例如 centos 和 training/webapp。
也学习了如何在docker hub搜索并下载镜像到本地计算机。如果本机计算机上没有该镜像,则会从远程仓库中下载,默认仓库为 Docker Hub Registry
本节中,将学习更多关于docker镜像的只是,包括:
管理和使用本机镜像
创建基础镜像
上传镜像到Docker Hub Registry
docker images #可以列出本地计算机上的所有镜像。
docker search centos #可以列出docker hub上所有关于centos (也可以说成搜索镜像的意思)
#上图中第一个的意思是:CentOS的官方搭建的意思。
之前使用过的镜像都是在启动容器时从DockerHub上下载的。
当查看镜像列表时,需要注意三个重要信息:
镜像所在的仓库,例如centos
镜像的标签(TAG),例如7.3.1611
镜像的IMAGE ID
Tips: 你可以使用第三方的图形工具 dockviz tool 或 镜像网站 查看镜像数据。
查询当前centos的版本:
当你的容器运行一个指定tag的镜像,命令如下:(如果想使用其他版本,换一下版本号即可)
###这里如果没有的话会下载到本地,如果命令中不指定tag,例如 centos, docker默认使用 centos:latest 镜像。
创建自己的镜像
将基于 training/sinatra 创建新镜像。
1、修改容器内容,并时候commit提交结果创建新镜像
2、使用dockerfile指定新镜像的创建指令