最近一直在忙項目,不知不覺2個多月沒有更新博客了。正好自學了幾天docker就乾脆總結一下,也順帶增長一篇《30分鐘入門系列》。網上可以查到的對於docker的定義我就再也不重複了,說說我本身對它的理解:Docker一個方便屢次部署的虛擬化Linux容器,與當下流行的SpringBoot和微服務框架搭配更加相得益彰,從而真正的作到從開發到部署的全流程靈敏。請注意這裏的三個關鍵詞:Linux容器,SpringBoot,靈敏。首先,Docker不能別用來部署本地應用(若是你有開發過基於Qt的桌面應用你就能體會到運行環境不統一對於開發人員來講簡直是噩夢)。其次,這篇博客是針對Java開發人員的,但Docker的使用場景毫不僅限於此。最後,靈敏意味着可能有一些開發方式須要調整,到底如何利用Docker應該是當你瞭解它以後須要認真思考的問題。java
1、環境準備mysql
我我的的測試環境爲VirtualBox,CentOS7及最新版本的Spring Boot。首先以最小化方式安裝CentOS:linux
推薦在安裝階段就默認打開網絡連接...接下來等待20分鐘虛擬機安裝完畢web
因爲是最小化安裝,完成之後推薦安裝幾條基礎命令:spring
1. yum updatesql
2. yum install -y net-tools vim curl wget docker
以上測試環境就算搭建完成,如下開始安裝Docker。咱們進入官方網站,他們已經很貼心的爲咱們準備好了安裝教程。目前我能夠登錄Docker的官方網站,而且基於Centos的安裝說明在這裏也能夠查看。不過爲了以防萬一,我在博客中仍是記錄一下若是你發現沒法訪問或閱讀英文有些困難直接跟着下面的流程走便可:apache
1. 卸載系統中的早期版本json
$ 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. 安裝工具vim
$ 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
2、操做指南
網上有關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:systemctl 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服務了。
3、構建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 項目成功!