您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Docker如何使用,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
Docker一個(gè)方便多次部署的虛擬化Linux容器,與當(dāng)下流行的SpringBoot和微服務(wù)框架搭配更加相得益彰,從而真正的做到從開(kāi)發(fā)到部署的全流程靈敏。請(qǐng)注意這里的三個(gè)關(guān)鍵詞:Linux容器,SpringBoot,靈敏。首先,Docker不能別用來(lái)部署本地應(yīng)用。其次,本文章是針對(duì)Java開(kāi)發(fā)人員的,但Docker的使用場(chǎng)景絕不僅限于此。最后,靈敏意味著可能有一些開(kāi)發(fā)方式需要調(diào)整,到底如何利用Docker應(yīng)該是當(dāng)你了解它之后需要認(rèn)真思考的問(wèn)題。
一、環(huán)境準(zhǔn)備
我個(gè)人的測(cè)試環(huán)境為VirtualBox,CentOS7及最新版本的Spring Boot。首先以最小化方式安裝CentOS:
推薦在安裝階段就默認(rèn)打開(kāi)網(wǎng)絡(luò)鏈接...接下來(lái)等待20分鐘虛擬機(jī)安裝完畢
由于是最小化安裝,完成以后推薦安裝幾條基礎(chǔ)命令:
1. yum update
2. yum install -y net-tools vim curl wget
以上測(cè)試環(huán)境就算搭建完成,以下開(kāi)始安裝Docker。我們進(jìn)入官方網(wǎng)站,他們已經(jīng)很貼心的為我們準(zhǔn)備好了安裝教程。目前我可以登陸Docker的官方網(wǎng)站,并且基于Centos的安裝說(shuō)明在這里也可以查看。不過(guò)為了以防萬(wàn)一,我在博客中還是記錄一下如果你發(fā)現(xiàn)無(wú)法訪問(wèn)或閱讀英文有些困難直接跟著下面的流程走即可:
1. 卸載系統(tǒng)中的早期版本
$ 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. 啟動(dòng)Docker
$ sudo systemctl start docker
6. 運(yùn)行Hello World
$ sudo docker run hello-world
7. 配置國(guó)內(nèi)的鏡像加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://57326c54.m.daocloud.io
二、操作指南
網(wǎng)上有關(guān)docker的命令有很多,詳細(xì)的說(shuō)明各位可以去更權(quán)威的地方查閱。這里我只列舉幾條最重要的命令并加以說(shuō)明:
1. 查閱鏡像列表:docker images
你應(yīng)該不會(huì)有這么多鏡像,但是至少應(yīng)該存在一條hello-world。沒(méi)錯(cuò)這就是你剛剛下載的測(cè)試鏡像。
2. 查閱容器列表:docker ps -a
你應(yīng)該也只會(huì)看到一條hello-world的容器。
這里我們已經(jīng)接觸到了有關(guān)docker的第一個(gè)重要概念:鏡像和容器。不過(guò)暫時(shí)我還不打算對(duì)這兩個(gè)概念加以說(shuō)明,我們可以反復(fù)運(yùn)行
$ sudo docker run hello-world
然后再查看容器列表:
沒(méi)錯(cuò),你現(xiàn)在發(fā)現(xiàn)多次運(yùn)行同一個(gè)鏡像只會(huì)發(fā)生一次鏡像下載,但是卻會(huì)出現(xiàn)多個(gè)容器。更準(zhǔn)確的說(shuō),你運(yùn)行了幾次hello-world就會(huì)生成幾個(gè)容器。
3. 停止和刪除容器:docker stop/rm [container_id]
我們刪除掉所有hello-world容器,瞬間整個(gè)世界變的美好了。
4. 刪除鏡像:docker rmi [image_id]
我們刪除掉hello-world鏡像,世界終于又歸于寂靜。
有了感性認(rèn)識(shí)以后,現(xiàn)在可以說(shuō)明鏡像和容器的概念:
鏡像就好像是iso文件,docker需要使用鏡像作為源。一個(gè)鏡像可以反復(fù)被使用,而每次當(dāng)docker通過(guò)鏡像啟動(dòng)起來(lái)的就是一個(gè)容器,容器之間相互隔離。如果容器被刪除了,在容器中的所有改變都會(huì)丟失。
用一張最經(jīng)典的圖來(lái)表示鏡像與容器的關(guān)系:
沒(méi)錯(cuò),一個(gè)完整的docker項(xiàng)目就應(yīng)該是這樣,在本地系統(tǒng)(boosfs)之上可能存在多個(gè)鏡像(image)它們之間存在繼承關(guān)系,而最上層處于運(yùn)行環(huán)境的就是容器(container)。所有的修改操作都只在容器中。如果容器被關(guān)閉數(shù)據(jù)會(huì)發(fā)生丟失,除非你將容器刻錄為新的鏡像層。不過(guò)我們還有別的更好的手段將數(shù)據(jù)保存下來(lái),但不在我們今天的討論中。
5. 獲取鏡像:docker pull [image_name]
**********************************************
請(qǐng)確認(rèn)你已經(jīng)配置了國(guó)內(nèi)的鏡像加速:
vim /etc/docker/daemon.json
配置:
{ "registry-mirrors": ["http://57326c54.m.daocloud.io"] }
重啟Docker:systermctl restart docker
**********************************************
先查詢一下與CentOS有關(guān)的鏡像
docker search centos
第一個(gè)看上去很“官方”的樣子
docker pull centos:latest
下載完成以后先查詢一下確認(rèn)鏡像沒(méi)有問(wèn)題docker images。
6. 交互的方式來(lái)啟動(dòng)鏡像:docker run -it [image_name] [args...]
docker run -it centos /bin/bash
咦?似乎沒(méi)有任何變化。再仔細(xì)看看,命令提示符是不是有變化。
沒(méi)錯(cuò),你已經(jīng)進(jìn)入了容器,現(xiàn)在是在容器的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
啟動(dòng)
$ sudo mysqld_safe
8. 離開(kāi)容器:Ctrl + q, Ctrl + p
這個(gè)組合鍵是用來(lái)退出容器并讓容器在后臺(tái)保持運(yùn)行
9. 重新登陸容器:docker exec -it [container_id] [args...]
docker exec -it 21f99e364fb1 bash
賦予MySQL的root用戶遠(yuǎn)程連接權(quán)限
# 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]
要提交自己的鏡像首先需要退出當(dāng)前容器:
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
這樣我們?cè)诒镜氐牟僮飨到y(tǒng)中就可以通過(guò)訪問(wèn)虛擬機(jī)的3307端口訪問(wèn)我們?cè)赿ocker中部署的mysql服務(wù)了。
三、構(gòu)建SpringBoot項(xiàng)目的docker鏡像
到目前為止,如果你的操作一切順利代表已經(jīng)掌握了docker的基本使用方法。上面的對(duì)于mysql的安裝其實(shí)只是起到一個(gè)拋磚引玉的作用,目的是讓你熟悉docker的基礎(chǔ)命令,實(shí)際在開(kāi)發(fā)中我們很少會(huì)將mysql部署在docker中。更常見(jiàn)的一個(gè)開(kāi)發(fā)場(chǎng)景是將SpringBoot項(xiàng)目生成docker鏡像,下面我們就正式進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)。
1. 在本地先構(gòu)建一個(gè)SpringBoot項(xiàng)目
通過(guò)SpringBoot的官網(wǎng)為我們生成一個(gè)基礎(chǔ)項(xiàng)目:
接著通過(guò)你喜歡的IDE導(dǎo)入并打開(kāi)項(xiàng)目,在pom.xml文件中添加依賴(lài):
<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>
編寫(xiě)一個(gè)controller文件:
@RestController public class DockerController { @RequestMapping("/") public String hello() { return "Hello Docker!"; } }
現(xiàn)在本地運(yùn)行一下,看看有沒(méi)有問(wèn)題。如果一切正常進(jìn)入下一步。
2. 接下來(lái)我們需要將項(xiàng)目放到docker的環(huán)境中去打包
(1) 在虛擬機(jī)中安裝jdk
yum -y install java-1.8.0-openjdk*
(2) 配置環(huán)境變量如下
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官網(wǎng)下載最新版本的maven
tar vxf apache-maven-3.5.4-bin.tar.gz mv apache-maven-3.5.4 /usr/local/maven3
(4) 配置環(huán)境變量如下
export MAVEN_HOME=/usr/local/maven3 export PATH=PATH:MAVEN_HOME/bin
(5) 使環(huán)境變量生效
source /etc/profile
(6) 編寫(xiě)DockerFile文件
在main目錄下添加一個(gè)docker目錄并創(chuàng)建DockerFile文件,文件內(nèi)容如下
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) 接著在項(xiàng)目路徑下使用maven打包
mvn package docker:build
如果中間發(fā)生構(gòu)建失敗可能的原因是你的項(xiàng)目名稱(chēng)和我的不一樣,請(qǐng)仔細(xì)檢查DockerFile文件,通常在第一次i構(gòu)建中你可能會(huì)遇到各種各樣的錯(cuò)誤信息。放到網(wǎng)上查一下就可以了。
構(gòu)建完成以后我們可以通過(guò)docker images查詢一下鏡像列表:
沒(méi)錯(cuò)第一個(gè)鏡像就是我們的項(xiàng)目。下面啟動(dòng)這個(gè)鏡像并通過(guò)服務(wù)器的80端口來(lái)映射:
docker run -p 80:8080 -t springboot/helloboot
最后我們?cè)诒镜赝ㄟ^(guò)瀏覽器直接訪問(wèn)虛擬機(jī)的ip,如果可以看到“Hello Docker!”
說(shuō)明使用 Docker 部署 Spring Boot 項(xiàng)目成功!
關(guān)于“Docker如何使用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。