Linux Centos 安裝 Docker 和 Docker的實際運用
安裝與啟動
安裝環境說明
Docker官方建議在Ubuntu中安裝,因為Docker是基於Ubuntu釋出的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支援更新最新的一些補丁包的。
我這裡使用的是Centos7的版本。不建議使用Centos6的版本,因為安裝前需要安裝其他的環境和補丁,而且Docker很多不支援更新。
安裝Docker
直接使用 yum 命令線上安裝
yum install docker
檢視Docker版本
docker -v
可以看到版本為 1.12.6
Docker啟動與停止常用命令
使用
systemctl
命令是系統服務管理器指令,它是 service 和 chkconfig 兩個命令組合。
- 啟動:systemctl start docker
- 停止:systemctl stop docker
- 重啟:systemctl restart docker
- 檢視狀態:systemctl status docker
- 開機啟動:systemctl enable docker
- 檢視概要:docker info
- 幫助檔案:docker --help
先檢視一下我們的docker是否是執行狀態
systemctl status docker
如果能看到 active(running)就說明現在docker是啟動狀態。
Docker 映象操作
什麼是映象
Docker映象是由檔案系統疊加而成(是一種檔案的儲存形式)。最底端是一個檔案引導系統,即bootfs,這很像典型的Linux/Unix的引導檔案系統。Docker使用者幾乎永遠不會和引導系統有什麼互動。實際上,當一個容器啟動後,它將會被移動到記憶體中,而引導檔案系統則會被解除安裝,以留出更多的記憶體供磁碟映象使用。Docker容器啟動是需要的一些檔案,而這些檔案就可以稱為Docker映象。
列出所有的映象
使用命令檢視所有映象 docker images
可以看到我目前有5個映象。
這裡解釋一下表頭
- REPOSITORY:映象所在的倉庫名稱
- TAG:映象標籤
- IMAGE ID:映象ID
- CREATED:映象的建立日期(不是獲取該映象的日期,面是上傳到遠端映象倉庫的日期)
- SIZE:映象大小
注意
:這裡的映象都是存在宿主機的/var/lib/docker
目錄下。
為了區分同一個倉庫下的不同映象,Docker提供了一種稱為標籤(Tag)的功能。每個映象在列出來時都帶有一個標籤,例如12.10、12.04等等。每個標籤對組成特定映象的一些映象層進行標記(比如,標籤12.04就是對所有Ubuntu12.04映象層的標記)。這種機制使得同一個倉庫中可以儲存多個映象。版本號。
我們在運行同一個倉庫中的不同映象時,可以通過在倉庫名後面加上一個冒號和標籤名來指定該倉庫中的某一具體的映象,例如docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash,表明從映象Ubuntu:12.04啟動一個容器,而這個映象的作業系統就是Ubuntu:12.04。在構建容器時指定倉庫的標籤也是一個好習慣。
搜尋映象
docker search 映象名稱
比如搜尋 docker search tomcat
- NAME:倉庫名稱
- DESCRIPTION:映象描述
- STARS:使用者評價,反應一個映象的受歡迎程度
- OFFICIAL:是否官方
- AUTOMATED:自動構建,表示該映象由Docker Hub自動構建流程建立的
注意
:搜尋映象必須要連網才能搜尋得到,STARS最高的那個是官方釋出的映象,我們一般就下載第一個映象即可
拉取映象
從DockerHub摘取,官網 https://hub.docker.com/explore/
。
Docker hub 最受歡迎的10大映象。Nginx毫無疑問排名第一。
使用命令拉取
docker pull centos:7
目前國內訪問docker hub速度上有點尷尬,使用docker Mirror勢在必行。現有國內提供docker映象加速服務的商家有不少,下面重點ustc映象。
所以這裡需要更改映象地址,ustc的docker映象加速器速度很快。ustc docker mirror的優勢之一就是不需要註冊,是真正的公共服務。地址:https://lug.ustc.edu.cn/wiki/mirrors/help/docker
接下來我需要修改檔案將下載映象地址配置進去。
1、進到 /etc/docker/daemon.json/檔案裡。如果檔案不存在手動建立一個。在centos7下。通過vim,如果沒有vim,yum install vim
裝一下就好了。
2、daemon.json內容如下:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
3、重啟docker服務,如果重啟docker無法加速,可以重新啟動OS
4、通過 docker pull 命令下載映象,速度非常快。
可以看到這速度是不是非常快。
刪除映象
- docker rmi IMAGE ID 刪除指定映象
- docker rmi `docker images -q` 刪除所有映象
Docker 容器操作
檢視容器
- 正在執行的容器
docker ps
- 檢視所有容器(啟動過的歷史容器)
docker ps -a
- 檢視停止的容器
docker ps -f status=exited
建立與啟動容器
建立容器常用的引數說明
- 建立容器命令:docker run
- -i:表示執行容器
- -t:表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端。
- –name :為建立的容器命名。
- -v:表示目錄對映關係(前者是宿主機目錄,後者是對映到宿主機上的目錄),可以使用多個-v做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上。
- -d:在run後面加上-d引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t兩個引數,建立後就會自動進去容器)。
- -p:表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映
互動式容器
建立一個互動式容器名為 mycentos
docker run -it --name=mycentos centos:7 /bin/bash
當輸入命令之後,建立成功的話會進入到剛剛自己建立的容器裡面。
我們可以新建一個容器檢視容器狀態,可以看到狀態是 UP ,代表執行狀態
使用 exit 命令退出當前容器
可以看到容器狀態也停止了 Exited
守護式容器
建立一個守護式容器:如果對於一個需要長期執行的容器來說,我們可以建立一個守護式容器。命令如下(容器名稱不能重複)
docker run -id --name=mycentos2 centos:7
可以看到輸入一長串的字母加數字,這就是容器的ID。
進入守護式容器
docker exec -it container_name
(或者 container_id) /bin/bash(exit 退出時,容器不會停止)
停止與啟動容器
- 停止正在執行的容器:
docker stop $CONTAINER_NAME | ID
docker stop mycentos2
- 啟動已執行過的容器:docker start
docker start$CONTAINER_NAME | ID
docker start mycentos2
檔案拷貝
- 拷貝檔案到容器內部
docker cp 需要拷貝的檔案或目錄 容器名稱:容器目錄
docker cp test.html mycentos2:/opt/
- 將檔案從容器內拷貝出來
docker cp 容器名稱:容器目錄 需要拷貝的檔案或目錄
docker cp mycentos2:/opt/test.html cp_test.html
目錄掛載
我們可以在建立容器的時候,將宿主機的目錄與容器內的目錄進行對映,這樣我們就可以通過修改宿主機某個目錄的檔案從而去影響容器。
- 建立容器 新增 -v 引數 後邊為 宿主機目錄:容器目錄
docker run -id -v /usr/local/html:/usr/local/container_html --name=mycentos3 centos:7
- 注意:如果你共享的是多級的目錄,可能會出現許可權不足的提示。
- 這是因為CentOS7中的安全模組selinux把許可權禁掉了,我們需要新增引數 --privileged=true 來解決掛載的目錄沒有許可權的問題
docker run -id -v /usr/local/html:/usr/local/container_html --name=mycentos3 --privileged=true centos:7
檢視容器IP地址
使用 inspect
檢視,輸入命令後直接拖到最後即可看到
docker inspect mycentos3
- 可以直接輸出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3
個人覺得直接使用 inspect
會容易,直接輸出IP會比較麻煩,而且容易打錯。
刪除容器
- 刪除指定容器:docker rm $CONTAINER_ID或NAME
docker rm mycentos
- 刪除所有容器:docker rm `docker ps -a -q`
docker rm `docker ps -a -q`
注意
:看到上面刪除只刪除了一個,第二沒有刪除成功,原因是因為第二個容器在執行中,所以不能刪除。刪除之前一定要先停止容器。
應用部署
MySQL部署
1、拉取MySQL映象
docker pull mysql
速度還是槓槓的
2、檢視映象
3、建立MySQL容器
docker run -id --name=test_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
- -p 代表埠對映,格式為 宿主機對映埠:容器執行埠
- -e 代表新增環境變數 MYSQL_ROOT_PASSWORD是root使用者的登陸密碼
4、進入MYSQL容器,我登陸MySQL
進入mysql容器,登入mysql
docker exec -it test_mysql /bin/bash
mysql -u root -p
可以看到又是熟悉的介面。
5、遠端登入MySQL
在Windows電腦上使用Navicat去連線Centos中的Docker容器裡的Mysql,我這裡IP為 192.168.60.128
。
- 出現以下錯誤,原因是因為我自己的navicat版本不支援這種格式的密碼,
caching_sha2_password
。具體解決辦法請檢視我這往篇文章 解決’caching_sha2_password連線問題
- 連線成功
注意:這裡埠號是
33306
,因為我們沒辦法連直接連線到容器的的mysql,給它對映一個tcp連線的33306埠,如果是雲伺服器需要通過 SSH 登入才能連線。
tomcat部署
1、拉取 tomcat 映象
docker pull tomcat:7-jre7
2、建立 tomcat 容器
docker run -id --name=test_tomcat -p 9000:8080 -v /usr/local/html:/usr/local/tomcat/webapps --privileged=true tomcat:7-jre7
- 這裡 -v 指定對映目錄,這樣宿主機的html目錄和webapps的目錄同步
- –privileged=true,是由於許可權問題,前面提到過,這裡就不多說了
3、cas單點登入應用部署
這裡由於我自己在本地電腦上有一個單點登入的應用,就直接上傳到 /usr/local/html
目錄即可。
- 修改一個數據庫連線配置即可
<!--自定義登入配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://172.17.0.2:3306/pinyougoudb?characterEncoding=utf8"
p:user="root"
p:password="123456" />
注意這裡連線的是剛剛建立的 test_mysql
資料庫,ip地址查詢前端已經說過,直接 docker inspcte test_mysql
就可以看到容器的IP地址。
- 輸入 http://192.168.60.128:9000/cas/login 可以看到下面介面。
Nginx部署
1、拉取 Nginx 映象
docker pull nginx
2、建立 Nginx 容器
docker run -id --name=test_nginx -p 80:80 nginx
3、測試 Nginx
瀏覽器輸入IP地址:http://192.168.60.128/ ,可以看到熟悉的介面,就說明Nginx容器已經部署成功。
4、配置反向代理
官方的nginx映象,nginx配置檔案nginx.conf 在/etc/nginx/
目錄下。
在容器內編輯配置檔案不方便,我們可以先將配置檔案從容器內拷貝到宿主機,編輯修改後再拷貝回去。
4.1、從容器拷貝配置檔案到宿主機
docker cp test_nginx:/etc/nginx/nginx.conf nginx.conf
4.2、編輯 nginx.conf,新增反向代理配置
upstream tomcat-cas {
server 172.17.0.3:8080;
}
server {
listen 80;
server_name cas.kyriecao.com;
location / {
proxy_pass http://tomcat-cas;
index index.html index.htm;
}
}
- server 172.17.0.3:8080 對應的是 test_tomcat 的IP和埠
- server_name www.kyriecao.com 是我在本地配置的虛擬主機
4.3、將修改後的配置檔案拷貝到容器
docker cp nginx.conf test_nginx:/etc/nginx/nginx.conf
4.4、重新啟動容器
docker restart test_nginx
4.5、配置虛擬主機,找到 C:\Windows\System32\drivers\etc\hosts
檔案新增配置
192.168.60.128 cas.kyriecao.com
4.6、瀏覽器測試就可以通過域名訪問了,不過這個是虛擬的域名,只能在你本地訪問
Redis部署
1、拉取 Redis 映象
docker pull redis
2、建立 Redis 容器
docker run -id --name=test_redis -p 6379:6379 redis
3、客戶埠連線測試
在 Windows版本下測試
redis-cli -h 192.168.60.128
- redis預設埠就是 6379 你可以不用指定埠也連線沒問題,如果埠不是 6379則需要指定埠
映象備份與遷移
1、容器儲存為映象
docker commit test_nginx test_nginx_black
- test_nginx 是容器名稱
- test_nginx_black 是新的映象名稱
- 此映象的內容就是你當前容器的內容,接下來你可以用此映象再次執行新的容器
2、映象備份
docker save -o test_nginx_black.tar test_nginx_black
- -o 輸出到檔案
3、映象恢復與遷移
不小心手抖了一下,把我們的 test_nginx_black 映象刪掉了,想恢復怎麼辦,執行下面命令進行恢復
docker load -i test_nginx_black.tar
- -i 輸入的檔案
寫這篇文章用了大概5個小時左右,雖然很枯燥、無味,最主要圖多,截圖截累了,不過收穫挺大的,寫完感覺很爽。寫得不好的地方請指出。