2021-05-12 14:32:11
30分鐘帶你了解Docker
自學了幾天Ddocker,就乾脆總結一下,也順帶增加一篇《30分鐘入門系列》。網上能夠查到的對於Docker的定義我就不再重複了,說說我自己對它的理解:Docker一個方便多次部署的虛擬化Linux容器,與當下流行的SpringBoot和微服務架構搭配更加相得益彰,從而真正的做到從開發到部署的全流程靈敏。請注意這裡的三個關鍵詞:Linux容器,SpringBoot,靈敏。首先,Docker不能別用來部署本地應用(如果你有開發過基於Qt的桌面應用你就能體會到執行環境不統一對於開發人員來說簡直是噩夢)。其次,這篇部落格是針對Java開發人員的,但Docker的使用場景絕不僅限於此。最後,靈敏意味著可能有一些開發方式需要調整,到底如何利用Docker應該是當你了解它之後需要認真思考的問題。
一、環境準備
我個人的測試環境為VirtualBox,CentOS7及最新版本的Spring Boot。首先以最小化方式安裝CentOS:
推薦在安裝階段就預設開啟網路連結...接下來等待20分鐘虛擬機器安裝完畢
由於是最小化安裝,完成以後推薦安裝幾條基礎命令:
1. yum update
2. yum install -y net-tools vim curl wget
以上測試環境就算搭建完成,以下開始安裝Docker。我們進入官方網站,他們已經很貼心的為我們準備好了安裝教學。目前我可以登陸Docker的官方網站,並且基於Centos的安裝說明在這裡也可以檢視。不過為了以防萬一,我在部落格中還是記錄一下如果你發現無法存取或閱讀英文有些困難直接跟著下面的流程走即可:
1. 解除安裝系統中的早期版本
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
2. 安裝工具
$ sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2
3. 設定Docker的安裝yum原
$ sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
4. 安裝Docker CE
$ sudo yum install docker-ce
5. 啟動Docker
$ sudo systemctl start docker
6. 執行Hello World
$ sudo docker run hello-world
7. 設定國內的映象加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://57326c54.m.daocloud.io
二、操作指南
網上有關docker的命令有很多,詳細的說明各位可以去更權威的地方查閱。這裡我只列舉幾條最重要的命令並加以說明:
1. 查閱映象列表:docker images
你應該不會有這麼多映象,但是至少應該存在一條hello-world。沒錯這就是你剛剛下載的測試映象。
2. 查閱容器列表:docker ps -a
你應該也只會看到一條hello-world的容器。
這裡我們已經接觸到了有關docker的第一個重要概念:映象和容器。不過暫時我還不打算對這兩個概念加以說明,我們可以反復執行
$ sudo docker run hello-world
然後再檢視容器列表:
沒錯,你現在發現多次執行同一個映象只會發生一次映象下載,但是卻會出現多個容器。更準確的說,你執行了幾次hello-world就會生成幾個容器。
3. 停止和刪除容器:docker stop/rm [container_id]
我們刪除掉所有hello-world容器,瞬間整個世界變的美好了。
4. 刪除映象:docker rmi [image_id]
我們刪除掉hello-world映象,世界終於又歸於寂靜。
有了感性認識以後,現在可以說明映象和容器的概念:
映象就好像是iso檔案,docker需要使用映象作為源。一個映象可以反復被使用,而每次當docker通過映象啟動起來的就是一個容器,容器之間相互隔離。如果容器被刪除了,在容器中的所有改變都會丟失。
用一張最經典的圖來表示映象與容器的關係:
沒錯,一個完整的docker專案就應該是這樣,在本地系統(boosfs)之上可能存在多個映象(image)它們之間存在繼承關係,而最上層處於執行環境的就是容器(container)。所有的修改操作都只在容器中。如果容器被關閉資料會發生丟失,除非你將容器燒錄為新的映象層。不過我們還有別的更好的手段將資料儲存下來,但不在我們今天的討論中。
5. 獲取映象:docker pull [image_name]
**********************************************
請確認你已經設定了國內的映象加速:
vim /etc/docker/daemon.json
設定:
{
"registry-mirrors": ["http://57326c54.m.daocloud.io"]
}
重新啟動Docker:systermctl restart docker
**********************************************
先查詢一下與CentOS有關的映象
docker search centos
第一個看上去很“官方”的樣子
docker pull centos:latest
下載完成以後先查詢一下確認映象沒有問題docker images。
6. 互動的方式來啟動映象:docker run -it [image_name] [args...]
docker run -it centos /bin/bash
咦?似乎沒有任何變化。再仔細看看,命令提示字元是不是有變化。
沒錯,你已經進入了容器,現在是在容器的CentOS操作介面。
7. 安裝Mysql
$ sudo yum install -y wget
$ sudo wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
$ sudo yum install mysql-community-server
設定
$ sudo mysql_install_db --user=mysql --ldata=/var/lib/mysql
啟動
$ sudo mysqld_safe
8. 離開容器:Ctrl + q, Ctrl + p
這個組合鍵是用來退出容器並讓容器在後台保持執行
9. 重新登陸容器:docker exec -it [container_id] [args...]
docker exec -it 21f99e364fb1 bash
賦予MySQL的root使用者遠端連線許可權
# mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('12345678') WHERE User = 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678' WITH GRANT OPTION;
mysql> flush privileges;
10. 提交映象:docker commit [container_id] [myimage_name:tag]
要提交自己的映象首先需要退出當前容器:
exit
docker commit 21f99e364fb1 centos:mysql
11. 埠對映:docker run -p [local_port]:[docker_port] -it [image_name] [args...]
docker run -p 3307:3306 -it centos:mysql /bin/bash
這樣我們在原生的作業系統中就可以通過存取虛擬機器的3307埠存取我們在docker中部署的mysql服務了。
三、構建SpringBoot專案的docker映象
到目前為止,如果你的操作一切順利代表已經掌握了docker的基本使用方法。上面的對於mysql的安裝其實只是起到一個拋磚引玉的作用,目的是讓你熟悉docker的基礎命令,實際在開發中我們很少會將mysql部署在docker中。更常見的一個開發場景是將SpringBoot專案生成docker映象,下面我們就正式進入實戰環節。
1. 在本地先構建一個SpringBoot專案
通過SpringBoot的官網為我們生成一個基礎專案:
接著通過你喜歡的IDE匯入並開啟專案,在pom.xml檔案中新增依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
編寫一個controller檔案:
@RestController
public class DockerController {
@RequestMapping("/")
public String hello() {
return "Hello Docker!";
}
}
現在本地執行一下,看看有沒有問題。如果一切正常進入下一步。
2. 接下來我們需要將專案放到docker的環境中去打包
(1) 在虛擬機器中安裝jdk
yum -y install java-1.8.0-openjdk*
(2) 設定環境變數如下
vim /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
export PATH=$PATH:$JAVA_HOME/bin
(3) 從Apache官網下載最新版本的maven
tar vxf apache-maven-3.5.4-bin.tar.gz
mv apache-maven-3.5.4 /usr/local/maven3
(4) 設定環境變數如下
export MAVEN_HOME=/usr/local/maven3
export PATH=PATH:MAVEN_HOME/bin
(5) 使環境變數生效
source /etc/profile
(6) 編寫DockerFile檔案
在main目錄下新增一個docker目錄並建立DockerFile檔案,檔案內容如下
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD helloboot-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
(7) 接著在專案路徑下使用maven打包
mvn package docker:build
如果中間發生構建失敗可能的原因是你的專案名稱和我的不一樣,請仔細檢查DockerFile檔案,通常在第一次i構建中你可能會遇到各種各樣的錯誤資訊。放到網上查一下就可以了。
構建完成以後我們可以通過docker images查詢一下映象列表:
沒錯第一個映象就是我們的專案。下面啟動這個映象並通過伺服器的80埠來對映:
docker run -p 80:8080 -t springboot/helloboot
最後我們在本地通過瀏覽器直接存取虛擬機器的ip,如果可以看到“Hello Docker!”
說明使用 Docker 部署 Spring Boot 專案成功!
更多Docker相關教學見以下內容:
Linux 下的 Docker 安裝與使用 https://www.linuxidc.com/Linux/2018-06/152996.htm
CentOS 7安裝Docker應用容器引擎 https://www.linuxidc.com/Linux/2018-06/152856.htm
CentOS 7.3環境安裝Docker 18.03 https://www.linuxidc.com/Linux/2018-05/152356.htm
使用Docker分分鐘啟動常用應用 https://www.linuxidc.com/Linux/2017-04/142649.htm
CentOS 7使用Docker搭建GitLab伺服器 https://www.linuxidc.com/Linux/2018-04/151725.htm
相關文章