面向開發者的Docker實踐
show me the code and talk to me,做的出來更要說的明白
本文源碼,請點擊learnSpringboot
我是布爾bl,你的支援是我分享的動力!
一、 引入
有開發經驗的都知道,幾乎每種技術都有一個吉祥物代表。那麼Docker
的吉祥物是怎麼樣的呢? 下圖我們可以看到Docker
是一個小鯨魚,他的上面運載者許多貨物。
二、快速入門
2.1 我為什麼要用Docker
那麼,Docker
究竟是什麼東西來的呢?Docker
由 Go
語言編寫,是一個免費開源的開放平台,可以運行在多個主流平台。Docker
可以用於開發應用、交付應用、運行應用。簡單來說,Docker
就像一個Linux
裡面的Linux
。那麼我們為什麼需要使用Docker
,因為Linux
在使用代價高,配置麻煩。一般我們使用Linux
伺服器需要向阿里、騰訊購買,是不是。不過,如果可以的話我們更喜歡白嫖。
因此,Docker
的出現就可以解決這個痛點了。只要你有想法,你可以在Linux
伺服器裡面安裝上Docker
,然後在Docker
裡面裝多個Linux`伺服器。
由於Docker
具有隔離性 ,我們無需擔心多個Linux
會互相影響(串味)。
另外的優點是,當我們安裝組件的時候,在Linux
上面很麻煩,在Docker
上面可以更快配置組件。我們還可以編寫Dockerfile
腳本,實現生產環境與開發環境同步配置的目的。
2.2 Docker
原理
我們在Linux
里安裝Docker
,其實跟我們以前在Windows
里安裝虛擬機一樣。Docker
利用了Linux
伺服器的物理特性,就像病毒一樣,寄生在伺服器裡面。
2.3 一些名字解釋
Docker
有一些名詞:鏡像、容器、Dockerfile、Docker Hub。
Docker Hub
就像我們使用的github
。裡面有各種各樣的鏡像。其中有分為官方和非官方,我們在拉取的時候當然是選擇官方啦。
在我們拉去鏡像回Docker
後,我們就可以運行了,就像快遞到家了,我們需要手撕他。然後鏡像就變成了容器。
另外我們也可以通過Dockerfile
將本地應用變成鏡像。
至於Docker Compose
,就是我們運行鏡像的時候,需要編寫一大推命令,而Docker Compose
可以以yml
文本形式快速運行鏡像,做到一次編寫,處處運行。
三、安裝Docker
我們可以在各個平台安裝運行Docker
。在這裡,我演示的是Linux
平台。
# 1、 yum 包更新到最新
yum update
# 2、安裝需要的軟體包, yum-utils 提供yum-config-manager功能, 另外兩個是devicemapper驅動依賴的
yum install -y yum-utils device-mapper-persistent-data 1vm2
# 3、設置yum源
yum-config-manager -- add-repo //download.docker.com/linux/centos/docker-ce.repo
# 4、安裝docker,出現輸入的介面都按 y
yum install -y docker-ce
# 5、查看docker版本,驗證是否驗證成功
docker -V
安裝成功後顯示
當然由於眾所周知的原因,我們的Docker
需要進行加速,不然就得忍受蝸牛般的速度。因此,我推薦阿里雲的Docker
容器鏡像加速配置。
四、常用命令
docker
作為一個類Linux
平台,自然也有命令行操作。當然,不喜歡命令行操作,推薦可以使用介面操作portainer
組件。
1. 啟動、停止
# 啟動
service docker start
# 停止
service docker stop
2. 查看版本
docker -v
這裡我們最好安裝1.3
以上版本
3. 搜索鏡像
docker search jdk
4. 拉取鏡像
docker pull 鏡像名
5. 查看鏡像
docker images
6. 運行鏡像
docker run -p 8083:8083 springio/gs-spring-boot-docker
前面埠是伺服器埠,後面是Docker
暴露的埠,這裡映射埠的目的是為了我們可以遠程訪問到Docker
裡面的容器。埠不一定相同。
可選參數
-d # Run container in background and print container ID:後台運行以及列印容器id
-v #掛載容器目錄到宿主機(伺服器),達到修改宿主機文件同步到容器文件目的
7.刪除鏡像
docker rmi 鏡像id
8.查看運行容器
docker ps
9.查看全部容器包括,沒有運行
docker ps -a
10.刪除容器
docker rm 容器id
11.查看容器運行日誌
docker logs 容器id
12.進入容器內部,命令行介面
docker exec -it 容器id /bin/bash
我們在啟動容器的過程,可能會碰到容器啟動失敗的情況。
五、Nginx
1.搜索Nginx
2.拉去Nginx
鏡像
3.運行Nginx
鏡像
docker run --name my_nginx
-d
-p 8081:80
-v /srv/web/logs:/var/log/nginx
-v /srv/web/conf/nginx.conf:/etc/nginx/nginx.conf
-v /srv/web/conf/default.conf:/etc/nginx/conf.d/default.conf
-v /srv/web/html:/usr/share/nginx/html
docker.io/nginx
說明
–name my_nginx 把容器起一個名字
-d 後台運行
-p 8081:80 將容器80埠映射到宿主機(伺服器)8081埠
-v /srv/web/logs:/var/log/nginx
掛載目錄, ” : “前面是宿主機目錄,後面是容器文件目錄
docker.io/nginx 原來鏡像名字
4.查看Nginx
容器
docker ps
六、實例之部署SpringBoot
1. 編寫程式碼
package com.example.demo2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Service;
@SpringBootApplication
public class Demo2Application {
public static void main(String[] args) {
E e = (E) SpringApplication.run(Demo2Application.class, args).getBean("ss");
e.test();
}
@Service(value = "ss")
class E {
public void test() {
System.out.println("service1111111");
}
}
}
2. 打包jar
mvn clean package -Dmaven.test.skip=true
在target
目錄找到jar
,重名lsb-helloworld
3. 編寫Dockerfile
文件
FROM docker.io/adoptopenjdk/openjdk8
COPY lsb-helloworld.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
然後將jar
和Dockerfile
文件上傳到Linux
伺服器的同一目錄
4. 運行Dockerfile
文件
docker build -t springio/gs-spring-boot-docker .
生成名為springio/gs-spring-boot-docker
的鏡像
5. 運行鏡像
docker run -p 8083:8083 springio/gs-spring-boot-docker