前言
大家好,我是jack xu,本篇是我在今日頭條的首秀,我的英文名來源于jack ma,馬云,所以大家也可以叫我徐云,即我希望像馬云一樣富有、成功,另外我名字中的杰與jack也是諧音關系。
今天給大家帶來的是一篇docker的科普入門篇,本文不會像其他文章一樣進行枯燥無味的純概念性介紹,docker是如何如何的好,用了docker就如何如何的6,而是以一個項目實戰讓大家從感性上認識一下docker,在做項目的過程中了解熟悉一些命令,然后在去看概念的東西會更容易上手。
本次實戰的架構圖如下,搭建一套Nginx+Spring Boot+MyBatis+MySQL的docker環境。

工具準備
首先我們需要一臺centos的機器操作,先吹下牛啊,因為我有錢任性,買了三臺云服務器,平時搭一些redis、kafak、zk等中間件做實驗用,一年期的,也快到期了,小伙們如果不像我這么任性的話可以用vmware或者virtualbox等虛擬機操作哦,我這里選的是第一臺106.12.84.31的機器。

安裝docker
工欲善其事必先利其器,既然要玩docker,那肯定是要先裝docker是吧,這里我也放了個菜鳥的鏈接,很簡單,大家照著操作就行。菜鳥鏈接
1、卸載之前的docker(可選)sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2、 安裝必要的依賴sudo yum install -y yum-utils device-mapper-persistent-data lvm23、設置docker倉庫 [設置阿里云鏡像倉庫可以先自行百度,后面課程也會有自己的docker hub講解]sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4、安裝dockersudo yum install -y docker-ce docker-ce-cli containerd.io5、啟動dockersudo systemctl start docker6、測試docker安裝是否成功sudo docker run hello-world復制代碼
安裝完docker后是不是萬事大吉,其實不然,還差一步,當我們在拉取鏡像的時候就會如下所示,卡主不動了,等幾個小時可能也不會好,這時候就需要我們安裝鏡像加速器。
[root@localhost ~]# docker pull mysqlUsing default tag: latestlatest: Pulling from library/mysql0a4690c5d889: Already exists 98aa2fc6cbeb: Already exists 0777e6eb0e6f: Already exists 2464189c041c: Already exists b45df9dc827d: Already exists b42b00086160: Already exists bb93567627c7: Already exists b9125bcebe66: Already exists d263609b23c7: Downloading [=============================> ] 27.63MB/46.88MBc9adffb2afb9: Download complete a555d31b3e6c: Download complete 9524d219b6db: Download complete復制代碼
登錄阿里云的官網,注冊個賬號,然后點擊左側菜單的最下面,如我用紅框標出來的,把鏡像加速器配置好即可,這個原理就像我們拉取maven的jar包時一樣,也會配阿里云的倉庫,所以讓我們一起感謝阿里,造福碼農。

配置好以后,就可以開始我們后面的操作了,我們從后往前開始安裝,即mysql->spring boot->nginx
科普
docker中有兩個重要的概念,一個是image,一個container,image就是鏡像,什么是鏡像。類比一下,就是我們在重裝系統的時候都要用ghost鏡像,這是由人家制作好的,這個鏡像上可能有各種各樣的軟件,而把這個鏡像在每一臺電腦上把系統重裝好,就是一個實例,就是我們所說的container。一個image可以生成多個container。
安裝MySQL
1)、首先創建自定義網橋,為什么要創建網橋,因為這么多容器都是要放在這一個網段里的,而在不同網段上的container是ping不通的
docker network create --subnet=172.18.0.0/24 jack-netdocker network ls [查看所有網絡]docket network inspect jack-net [查看詳情]docker network rm jack-net [刪除]復制代碼
2)、拉取鏡像,不加版本默認拉取最新的,也可以指定版本mysql:5.7
docker pull mysql復制代碼
3)、創建volume,為什么需要volume,你可以理解為持久化,mysql保存的數據都是存在磁盤上的,我們需要把docker中生成的數據掛載到宿主機上
docker volume create v1復制代碼
4)、創建mysql容器,-d是后臺運行,--name是給container起的名字,-v就是掛載,-p是端口映射,docker中的3306映射到宿主機的3306,-e是密碼,--net是使用哪個網段,--ip是在這個網段中用的地址
docker run -d --name jack-mysql -v v1:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=jack123 --net=jack-net --ip 172.18.0.6 mysql復制代碼
5)、接下來我們來做測試,用navicate連接,執行.mysql文件新建表
name:jack-mysqlip:106.12.84.31 [宿主機的ip] 端口:3306 [宿主機端口]user:rootpassword:jack123 [創建container時我們設的密碼]復制代碼

???????????????????????????????????? 連接成功
create schema jack_springboot collate utf8mb4_0900_ai_ci;use jack_springboot;create table t_user(id int not nullprimary key,username varchar(50) not null,password varchar(50) not null,number varchar(100) not null);復制代碼
???????????????????????????????????? 建表語句

???????????????????????????????????? 插入一條數據
mysql到此就準備好了
安裝Spring Boot項目
1)、首先搭建一個springboot +mybatis項目,這個很簡單,簡單的三層架構,這里我放上我github的地址,github.com/xuhaoj/spri… 大家可以star一下

????????????????????????????????????項目結構
這里寫的是mysql container的ip地址和端口,因為在同一個網段中,容器之間不僅可以通過ip訪問,也可以通過名稱,因為內置了一個DNS的解析,即jdbc:mysql://my-mysql:3306/xxxxx

2)、將項目進行打包,在項目的target下找到"springboot-mybatis-0.0.1-SNAPSHOT.jar"
mvn clean package -Dmaven.test.skip=true復制代碼
3)、在centos7創建一個文件夾
mkdir -p xhj/springboot-mybatis復制代碼
4)、安裝文件傳輸工具,將"springboot-mybatis-0.0.1-SNAPSHOT.jar"上傳到該目錄下
yum install lrzszrz -y復制代碼
5)、創建并且編寫dockerfile,好,這里的關鍵來了,我們平時生成container是把別人已經制作好的image拉取下來,而現在這是我們自己的項目,所以這個image需要我們自己做,而制作的原材料就是dockerfile
vi DockerfileFROM openjdk:8MAINTAINER itcrazy2016LABEL name="springboot-mybatis" version="1.0" author="itcrazy2016"COPY springboot-mybatis-0.0.1-SNAPSHOT.jar springboot-mybatis.jarCMD ["java","-jar","springboot-mybatis.jar"]復制代碼
6)、生成image鏡像
docker build -t sbm-image .復制代碼
查看一下,我們自己的image已經生成好了

7)、最后一步,通過我自己制作的image生成三個springboot項目容器,這里的命令和生成mysql的一樣,不在重復說明
docker run -d --name sb01 -p 8081:8081 --net=jack-net --ip 172.18.0.11 sbm-imagedocker run -d --name sb02 -p 8082:8081 --net=jack-net --ip 172.18.0.12 sbm-imagedocker run -d --name sb03 -p 8083:8081 --net=jack-net --ip 172.18.0.13 sbm-image復制代碼
查看一下,至此,我們自己項目和mysql的container都已經生成好了

安裝Nginx
好,現在是最后一步了,勝利的曙光就在眼前
1)、在宿主機中xhj/nginx目錄下新建一個nginx.conf文件,這里的ip和端口還是container自己的ip和端口,不要填寫宿主機的
user nginx;worker_processes 1;events { worker_connections 1024;}http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; location / { proxy_pass http://balance; } } upstream balance{ server 172.18.0.11:8081; server 172.18.0.12:8081; server 172.18.0.13:8081; } include /etc/nginx/conf.d/*.conf;}復制代碼
2)、拉取nginx鏡像
docker pull nginx復制代碼
3)、創建nginx容器,通過掛載的方式,container中的配置文件就是讀取我們宿主機中創建的配置文件,so easy
docker run -d --name my-nginx -p 80:80 -v /xhj/nginx/nginx.conf:/etc/nginx/nginx.conf --network=jack-net --ip 172.18.0.10 nginx復制代碼
4)、最后我們用postman來驗證一下,這里nginx配的是80端口,http默認端口就是80,所以我不需要在加端口
http://宿主機ip/user/listall復制代碼

至此,大功告成,我們的docker初體驗圓滿成功!
總結
小伙伴看完這篇文章有沒有感覺很神奇,區區幾個命令就把這么多東西給部署起來了。而在此之前就是各種各樣的安裝,繁瑣的配置,試想該項目中只是用了mysql,而真正項目中還會用到redis、kafak、zookeeper等中間件的使用,這些東西還不能只是單機,還要考慮集群高可用,那無異于運維成本是相當大的,而使用了docker就會簡單很多。
大家可以跟著做一下,或者不愿意做的話看完這篇文章至少會對docker有一個感性的認識,很多時候我們做java開發,只要我們代碼往上一推,過一會編譯部署以后新功能就能訪問到了,這一系列的CI/CD背后就是強大的工具技術支持jenkins、docker、k8s,這些運維團隊都幫我們做好了,俗話說技多不壓身,我們在做開發的同時還需要了解一些運維知識來充實自己。
最后我們要保持一個空杯心態,小伙伴看完以后可能會覺得運維也不過如此,其實不然,這只是冰山一角,真實中的運維場景會比這復雜很多,比如
- 今天這多container都是一個個敲命令,重復工作很多,也很累,尤其是端口、映射、掛載啊多了以后完全分不清,這時候就要用到docker compose技術,這是相當于一個yml文件,可以一鍵幫我們部署
- 而且這么多container都是部署在單機上,當container很多的時候一臺機器是扛不住,而且很多時候我們會做高可用,存在多機部署的情況,這就需要用到docker swarm和k8s等容器編排技術
- 本項目中用的mysql也是單機,而如果我們要做mysql集群的話還需要用到haproxy+pxc技術 .....
總之,要學的還有很多,感謝大家的收看,如果你覺得不錯,請動手點個贊。