docker學習(二)
4. 構建一個映象
- 構建hello-world
docker映象通過Dockerfile構建。
建立名稱為Dockerfile空白檔案,其中錄入以下內容:
FROM alpine:3.9
cmd ["echo", "hello world"]
此檔案的意思是,基於alpine:3.9這個微型linux映象構建,並在每次啟動docker映象的時候執行 "echo"命令輸出一
個“hello world”
在Dockerfile所在資料夾使用以下命令構建:
docker build -t glf_hello .
這個命令意思是,以當前目錄為上下文環境,構建出一個名稱為 glf_hello:latest 的docker映象。
完成後,再使用docker images命令檢視:
即可執行此映象:
docker run glf_hello
即可看到如下輸出:
- 修改nginx映象
使用run命令來在建立映象時修改映象中的內容,此處run命令執行 echo一段文字來更改nginx的預設首頁內容
FROM nginx
RUN echo '<h1>hello docker</h1>' > /usr/share/nginx/html/index.html
使用以下命令構建
docker build -t glf_nginx .
執行構建的映象檢視
docker run -d --name=mynginx -p 80:80 glf_nginx
可以看到nginx的預設首頁內容已經更換
- 構建複雜的jdk映象
以下為Dockfile內容
FROM centos:7
ENV JAVA_HOME /opt/jdk
ENV PATH ${JAVA_HOME}/bin:${PATH}
COPY jdk1.8.0_121.tar.gz /tmp/jdk1.8.0_121.tar.gz
RUN mkdir -p "$JAVA_HOME"; \
tar --extract --file /tmp/jdk1.8.0_121.tar.gz --directory "$JAVA_HOME" --strip- components 1; \
rm /tmp/jdk1.8.0_121.tar.gz;
WORKDIR /opt/jdk
ENV命令來在建立環境變數,這個環境變數會固化在映象中,在構建時和執行映象時都可以使用
COPY命令來將外部環境中的內容複製到docker映象的上下文中,以便在docker中使用
RUN命令來執行具體的建立jdk的過程,主要分為:建立目錄、解壓jdk壓縮包、刪除jdk壓縮包
WORKDIR命令來指定執行映象時預設的目錄
#構建命令
docker build -t glf_centos_jdk:8 .
#執行構建成的映象
docker run -it --rm glf_centos_jdk:8 java -version
- 將一個容器修改後設定為映象
我們將一個容器執行起來,修改後再通過commit將其構建成映象
#啟動一個nginx映象,並命名
docker run -d --name=mynginxdev nginx
#以互動方式進入容器
docker exec -it mynginxdev bash
#將當前日期輸出到index.html中
date > /usr/share/nginx/html/index.html
#退出容器 exit #停止容器
docker stop mynginxdev
#將容器commit為一個新的映象
docker commit mynginxdev nginx:glf_build
#檢視新構建的映象
docker images|grep nginx
#啟動一個新的映象
docker run -d -p 8001:80 nginx:glf_build
#再啟動一個新的映象
run -d -p 8002:80 nginx:glf_build
#啟動一箇舊的映象
docker run -d -p 80:80 nginx
5. 構建一個微服務映象
-
微服務結構
我們構建一個簡單的微服務例項,包括一個eureka註冊中心和兩個app。其中註冊中心我們直接做成映象,app直接
使用jdk映象。
-
構建Eureka映象
先來製作eureka微服務映象,在工作目錄以準備以下檔案:
.
├── config #erueka微服務配置
│ └── application.properties
├── Dockerfile #映象構建檔案
├── eureka.jar #eureka微服務jar包
└── start.sh #微服務啟動指令碼
Dockerfile內容為:
#基於我們自己在centos中構建的jdk
FROM glf_centos_jdk:8
#在容器中建立/data目錄
RUN mkdir -p /data
#將eureka的jar包複製進容器
COPY eureka.jar /data/eureka.jar
#將配置檔案目錄複製進容器
COPY config /data/
#將啟動指令碼複製進容器
COPY start.sh /data/start.sh
#設定預設工作目錄 WORKDIR /data
#設定啟動命令
ENTRYPOINT ["sh", "/data/start.sh"]
小知識點CMD和ENTRYPOINT的區別:
CMD配置的內容會被覆蓋
ENTRYPOINT不會被覆蓋
docker run glf_hello
docker run glf_hello echo "aaa"
啟動指令碼的內容:
#!/bin/sh
cd /data java -jar eureka.jar
配置檔案config/application.properties檔案內容
server.port=8888 #容器內埠8888
eureka.instance.hostname=my-eureka-server #主機名
eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.server.enableSelfPreservation=false #關閉自我保護
在此目錄構建映象:
#構建
docker build -t my_eureka .
#檢視映象
docker images|grep my_eureka
- 啟動Eureka服務
再準備一個資料夾eureka-server,其中放置如下檔案:
.
├── config #erueka微服務配置
│ └── application.properties
└── start.sh #啟動指令碼
config資料夾中放置與在構建映象時同樣的配置檔案,以方便增加或修改引數。
start.sh啟動指令碼如下:
#!/bin/sh
docker run -d --name=server --hostname=my-eureka-server -v /home/glf/server/eureka- server/config:/data/config -p 8000:8888 my_eureka
–name=server 指定啟動後的容器名稱為server
–hostname=my-eureka-server 指定啟動後的容器的主機名為my-eureka-server
-v /home/glf/server/eureka-server/config:/data/config 將外部config目錄對映到容器內來覆蓋預設
-p 8000:8888 將內部的8888埠對映到外部的8000埠
啟動eureka服務
chmod 777 start.sh ./start.sh #檢視啟動後的容器 docker ps #檢視啟動日誌 docker logs -f server
- 啟動app01微服務
分析erueka服務的映象,我們會發現只是在Jdk映象中放置了一個jar包,以後jar包一變就需要重新打映象,在一些場
景下可以太浪費資源(對於需要按照映象進行版本管控或定製化內部較高的情況除外)。對於app01我們不再重新構
建映象,直接使用jdk映象來啟動。
在工作目錄準備以下目錄及檔案:
.
├── data
│ ├── app01.jar
│ └── config
│ └── application.properties
└── start.sh
啟動指令碼 :
#!/bin/sh
docker run -d --name=app01 --hostname=my-app01-client -v /home/glf/server/app01/data:/data --link server:my-eureka-server -p 8001:8888 glf_centos_jdk:8 sh -c "cd /data && java -jar /data/app01.jar"
application.properties檔案,這裡
server.port=8888
spring.application.name=app01
eureka.instance.prefer-ip-address=true eureka.client.serviceUrl.defaultZone=http://my-eureka-server:8888/eureka/
prefer-ip-address 需要設定為true,因為沒有在server中link這些app對應的容器,預設是無法通過hostname
即my-app01-client來訪問到app的,但是預設這些容器都在同一個網路中,可以通過ip訪問通
需要注意的時 defaultZone需要寫my-eureka-server,這是通過–link設定的,讓當前容器通過my-eurekaserver這個hostname可以訪問到eureka伺服器
啟動app01:
chmod 777 start.sh ./start.sh
#檢視啟動後的容器
docker ps
#檢視啟動日誌
docker logs -f server
- 啟動app02微服務
與app01相同,只是修改了部分配置。
目錄結構:
.
├── data │
├── app02.jar
│ └── config
│ └── application.properties
└── start.sh
啟動指令碼 start.sh
#!/bin/sh
docker run -d --name=app02 --hostname=my-app02-client -v /home/glf/server/app02/data:/data --link server:my-eureka-server -p 8002:8888 glf_centos_jdk:8 sh -c "cd /data && java -jar /data/app02.jar"
配置檔案application.properties
server.port=8888
spring.application.name=app02
eureka.instance.prefer-ip-address=true
eureka.client.serviceUrl.defaultZone=http://my-eureka-server:8888/eureka/
啟動完成可以看到eureka兩個服務都註冊上了:
6. 參考資料
CentOS下Docker CE安裝方法: https://docs.docker.com/install/linux/docker-ce/centos/
Docker-hub地址:https://hub.docker.com
Hello-World官方映象的Dockerfile原始碼地址: https://github.com/docker-library/hello-world/tree/master/amd64/hello-world
Dockerfile 官方文件:https://docs.docker.com/engine/reference/builder/
Dockerfile 常用命令介紹:https://www.cnblogs.com/boshen-hzb/p/6400272.html
RabbitMQ官方映象地址: https://hub.docker.com/_/rabbitmq?tab=description
相關文章
- Docker學習(二)- Docker 安裝 JenkinsDockerJenkins
- 【Docker 系列】docker 學習 二,Docker 的常用命令Docker
- [Docker 系列]docker 學習 二,Docker 的常用命令Docker
- Docker構建自己的容器(學習筆記二)Docker筆記
- Docker 學習筆記(第二集:image)Docker筆記
- docker 學習Docker
- docker學習Docker
- 【Docker 系列】docker 學習 三Docker
- [Docker 系列]docker 學習 三Docker
- Docker 容器學習Docker
- Docker學習2Docker
- Docker學習—SwarmDockerSwarm
- Docker學習—MachineDockerMac
- Docker學習—ComposeDocker
- Docker學習—DockerFileDocker
- Docker學習-四Docker
- docker學習4:Docker 映象使用Docker
- docker學習3:Docker Hello WorldDocker
- [Docker 系列]docker 學習八,Docker 網路Docker
- docker學習6:Docker 安裝 NginxDockerNginx
- docker學習5:Docker 容器連線Docker
- docker學習3:Docker容器使用Docker
- docker學習1:CentOS Docker 安裝DockerCentOS
- docker學習7:Docker 安裝 PHPDockerPHP
- 【Docker】動手寫Dockerfile學習DockerDocker
- Docker 學習 一:Docker 是什麼Docker
- Docker 學習 一,Docker 是什麼Docker
- Docker 基礎學習Docker
- Docker學習記錄Docker
- Docker學習筆記Docker筆記
- docker技術學習Docker
- Docker-Compose學習Docker
- Docker 學習筆記Docker筆記
- Docker學習(十)Docker容器編排 Docker-composDocker
- Linux基礎學習-Docker學習筆記LinuxDocker筆記
- docker的學習總結Docker
- Docker學習 ,超全文件!Docker
- DLJD_Docker學習_01Docker