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鏡像、倉庫、容器之間的關係還有它們之間關聯的命令。