Docker是一个开源的商业软件产品,有两个版本:社区版(Community Edition,缩写为CE)和企业版(Enterprise Edition,缩写为EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的安装部署Docker的版本都是针对社区版。Docker的运行环境一般要求64的CPU,Linux内核版本在3.10以上,Linux内核具有cgroups和namespaces功能。
系统环境说明:
系统版本:CentOS 7
内核版本:3.10.0-862.el7.x86_64
关闭SElinux、Firewalld、Iptables等功能,配置本地yum仓库
1)下载官方源并安装
[root@docker ~]# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
--2019-08-31 14:46:54-- https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
Resolving mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.8.193, 2402:f000:1:408:8100::1
Connecting to mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.8.193|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2424 (2.4K) [application/octet-stream]
Saving to: ‘docker-ce.repo.1’
100%[====================================================>] 2,424 --.-K/s in 0s
2019-08-31 14:46:54 (131 MB/s) - ‘docker-ce.repo.1’ saved [2424/2424]
[root@docker ~]#
[root@docker ~]# yum install http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.74-1.el7.noarch.rpm
.....................................
#安装容器运行所需要的软件包
[root@docker ~]# yum install docker-ce
[root@docker ~]# rpm -ql docker-ce
/usr/bin/docker-init
/usr/bin/docker-proxy
/usr/bin/dockerd
/usr/lib/systemd/system/docker.service
/usr/lib/systemd/system/docker.socket
/var/lib/docker-engine/distribution_based_engine-ce.json
2)初始化docker并启动服务
docker的配置文件为:/etc/docker/daemon.jjson(此文件需要自己创建)
[root@docker ~]# cd /etc/docker/
[root@docker docker]# touch daemon.json
#配置docker镜像加速
[root@docker docker]# vim daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
#验证docker是否已经安装成功
[root@docker docker]# docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
#或者使用docker info命令查看docker的详细信息
#启动docker服务
[root@docker docker]# systemctl start docker.service
3)docker的基础命令
docker search image-name #根据镜像名称搜索镜像
docker pull image-name #从仓库拉取镜像到本地
docker image ls #查看本地的所有镜像;-a查看详细信息
docker rmi image-name #删除某一个镜像
docker tag #给一个镜像打标签
docker push #推送本地镜像到远端仓库
docker commit #创建一个新镜像
docker run #运行一个容器
docker start #启动一个容器
docker stop #停止一个容器
docker restart #重启一个容器
docker rename #给容器重新命名
docker kill #杀死一个正在运行的容器
docker rm #删除一个容器实例
docker inspect #查看一个容器实例的详细信息
docker container ls #查看所有的容器实例,-a可查看详细信息
docker top #查看一个容器内正在运行的进程
docker logs #查看一个容器的日志文件
docker build #创建一个Dockerfile文件
docker port #查看一个容器的端口映射状态
docker stats #查看某一个容器运行时的详细状态信息
4)创建一个容器实例
#创建一个容器实例之前我们需要先去docker的官方仓库拉取镜像来本地,根据本地镜像来生成容器并运行
#我们先搜索镜像
[root@docker ~]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 2620 [OK]
centos/httpd 24 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 22
arm32v7/httpd The Apache HTTP Server Project 8
#然后我们根据镜像的名称开拉取镜像,注意:如果不在镜像的后面写明镜像的版本,
#docker默认从镜像仓库中拉取latest最新版的镜像
[root@docker ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
1ab2bdfe9778: Pull complete
174a8e3bca83: Pull complete
c8e4c9e94892: Pull complete
4568916ecf2d: Pull complete
533f5cf513cb: Pull complete
Digest: sha256:98caed3e3a90ed9db8d25dcbb98eebe0ce56358a9dbbc940d7eb66a8e2b88252
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
[root@docker ~]#
[root@docker ~]# docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 7d85cc3b2d80 9 days ago 154MB
#给镜像打标签
[root@docker ~]# docker tag httpd:latest httpd:v0.1
[root@docker ~]# docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 7d85cc3b2d80 9 days ago 154MB
httpd v0.1 7d85cc3b2d80 9 days ago 154MB
#我们有了基础镜像后就可以创建运行一个docker实例啦
[root@docker ~]# docker run --name webapp01 -d httpd:v0.1
a47fe8335657dde1449fd40e21e51ab2395f63af8bf117cc7cca4adedc03d608
#run --name表示运行一个容器并自定义容器名称
#-d 代表在后台运行,最后跟上镜像的名称
[root@docker ~]#
[root@docker ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a47fe8335657 httpd:v0.1 "httpd-foreground" 17 seconds ago Up 11 seconds 80/tcp webapp01
#此时我们已经有了一个运行httpd服务的容器了,我们可以来查看一下它的信息
[root@docker ~]# docker inspect webapp01
[
{
"Id": "a47fe8335657dde1449fd40e21e51ab2395f63af8bf117cc7cca4adedc03d608",
"Created": "2019-08-31T07:40:55.741413872Z",
"Path": "httpd-foreground",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 51584,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-08-31T07:41:00.463663139Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
..............................................
#我们可以看到这个容器有一个根据docker的虚拟交换机所分配到的ip地址
#我们根据ip地址来试试是否可以访问到该容器的web服务
[root@docker ~]# curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>
[root@docker ~]#
#如果我们需要进入到一个容器内部去查看容器的各信息呢?
[root@docker ~]# docker exec -it webapp01 /bin/bash
root@a47fe8335657:/usr/local/apache2#
root@a47fe8335657:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
#exec表示在运行的一个容器中运行一个命令
#-it表示以交互式的方式进行并分配一个tty终端,并写上容器名称
#/bin/bash表示进入容器之后使用哪个shell来进行交互
root@a47fe8335657:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@a47fe8335657:/usr/local/apache2# cd htdocs/
root@a47fe8335657:/usr/local/apache2/htdocs# ls
index.html
root@a47fe8335657:/usr/local/apache2/htdocs# cat index.html
<html><body><h1>It works!</h1></body></html>
#可以看到确实是我们刚刚在宿主机上查看到的web服务内容
总结:和上篇认识Docker博客中提到的一样,Docker最重要的三个概念就是仓库、镜像和容器;仓库中存储的各类应用程序的镜像,我们需要把镜像拉取到本地中来,在本地根据镜像来启动运行成为一个容器实例,下面这张图非常清晰的显示了Docker镜像、仓库、容器之间的关系还有它们之间关联的命令。