==1. 概念==
1.1 Docker鏡像 - Docker Images
容器運行時的只讀模板姑蓝,操作系統(tǒng) + 軟件運行環(huán)境 + 用戶程序
class User {
private String username;
private Integer age;
}
1.2 Docker 容器 - Docker Containers
容器包含了某個應(yīng)用運行所需要的全部環(huán)境
User user = new User();
1.3 Docker 倉庫 - Docker Registeries
用來保存鏡像辰妙,有公有和私有倉庫谬以,比如Maven的中央倉庫和本地私服
[圖片上傳失敗...(image-e74e3-1551267580996)]
1.4 Tips
Docker Images : Java Class
Docker Containers : Java Object
通過類創(chuàng)建對象,通過鏡像創(chuàng)建容器
==2. 常見命令==
1.搜索鏡像 : docker search rabbitmq:management
2.查看系統(tǒng)鏡像 : docker images
3.拉取鏡像 : docker pull rabbitmq:management
rabbitmq:management是具體鏡像名稱(格式 REPOSITORY:TAG)
REPOSITORY : 表示鏡像的倉庫源
TAG : 鏡像的標(biāo)簽
4.運行一個容器 :
docker run -d -p 5672:5672 -p 15672:15672 --name beebee_mq rabbitmq:management
docker run -d -p 6379:6379 --name "xd_redis" 4e8db158f18d
docker run -it beebee-api
docker run -d -p 8088:8088 -itv /software/docker/hadoop1/:/tmp --name hadoop1 id/name
docker run : 運行一個容器
-i : 以交互模式運行容器盐肃,通常與 -t 同時使用
-t : 為容器重新分配一個偽輸入終端,通常與 -i 同時使用
-v : 給容器掛載存儲卷族扰,掛載到容器的某個目錄
-d : 后臺運行
-p : 端口映射
rabbitmq:management(格式 REPOSITORY:TAG)丽惭,如果不指定tag,默認使用最新的
4e8db158f18d : IMAGE-ID
--name : 容器名稱
5.查看當(dāng)前運行的容器 : docker ps
6.檢查容器內(nèi)部信息 : docker inspect id/name
7.刪除鏡像 : docker rmi 鏡像名稱
-f : 強制刪除
8.刪除某個容器 : docker rm id/name(容器必須是停止?fàn)顟B(tài))
9.停止某個容器 : docker stop id/name
10.啟動某個容器 : docker start id/name
11.查看啟動日志 : docker logs -f id/name
12.在容器里面進行操作 : docker exec -it nginx /bin/bash
13.構(gòu)建鏡像 : docker build -t eureka-server .
14.查看所有的容器 : docker ps -a
15.復(fù)制Linux到docker-文件 : docker cp nginx.conf my-nginx:/etc/nginx/nginx.conf
16.復(fù)制docker到Linux-文件夾 : docker cp my-nginx:/etc/nginx /etc/
==3. 高級命令==
1.查看所有的容器 : docker ps -a
2.進入docker容器 : docker exec -it web-nginx /bin/bash , docker attach web-nginx
3.停止守護式容器 : docker stop web-nginx , docker kill web-nginx
4.查看容器詳情 : docker inspect id/name
5.查看容器端口映射 : docker port web-nginx
6.容器IP地址 : docker inspect id/name --> NetworkSettings --> IPAddress
7.查看docker存儲位置和驅(qū)動 : docker info
8.停止所有的容器 : docker stop $(docker ps -a -q)
9.刪除所有未運行的容器 : docker rm $(docker ps -a -q)
10.刪除所有未打tag的鏡像 : docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
11.刪除所有鏡像 : docker rmi $(docker images -q)
12.docker network
docker network create : 創(chuàng)建
docker network connect
docker network ls : 列出
docker network rm : 刪除
docker network disconnect
docker network inspect
==4. 啟動nginx==
1. 啟動-映射web文件夾 : docker run -dit -p 80:80 -p 443:443 -v /usr/share/nginx/html:/usr/share/nginx/html —name ng 42b4762643dc
2. 復(fù)制docker中nginx配置到Linux : docker cp ng:/etc/nginx /etc
3. 停止docker : docker stop ng
4. 重啟docker : docker start ng
5. 啟動-映射配置文件夾 : docker run -dit -p 80:80 -p 443:443 -v /usr/share/nginx/html:/usr/share/nginx/html -v /etc/nginx:/etc/nginx —name ng 42b4762643dc
==5. 將項目打包為Docker鏡像==
5.1 添加pom依賴
<properties>
<docker.image.prefix>beebee</docker.image.prefix>
</properties>
<build>
<finalName>docker-demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
5.2 根目錄拍谐,新建Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
5.3 構(gòu)建鏡像
mvn install -DskipTests dockerfile:build
5.4 推送鏡像到倉庫
登錄倉庫 : docker login --username=anson.zhifu@gmail.com registry.cn-beijing.aliyuncs.com
鏡像打標(biāo)簽 : docker tag [ImageId] registry.cn-beijing.aliyuncs.com/beebee/51taqu:[鏡像版本號]
推送鏡像 : docker push registry.cn-beijing.aliyuncs.com/beebee/51taqu:[鏡像版本號]
拉取鏡像 : docker pull registry.cn-beijing.aliyuncs.com/beebee/51taqu:[鏡像版本號]
阿里云倉庫 : https://cr.console.aliyun.com
==6.Dockerfile==
1-FORM:基于什么鏡像烛缔,F(xiàn)ROM <image>或FROM <image>:<tag>
2-MAINTAINER:維護者信息,MAINTAINER <name>
3-RUN:在基礎(chǔ)鏡像上執(zhí)行轩拨,搭建環(huán)境践瓷,RUN <command> 或 RUN ["executable", "param1", "param2"]
4-CMD:啟動容器時執(zhí)行的命令,只能有一條
? CMD ["executable","param1","param2"] 使用 exec 執(zhí)行亡蓉,推薦方式晕翠;
? CMD command param1 param2 在 /bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用砍濒;
? CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數(shù)淋肾;
5-EXPOSE:容器暴露的端口號,EXPOSE <port> [<port>...]
6-ENV:指定環(huán)境變量爸邢,會被后續(xù)的RUN指令使用樊卓,并在容器運行時保持
7-ADD:就是復(fù)制文件到容器中,ADD <src> <dest>杠河,<src>:可以是一個本地文件碌尔,可以是URL,tar文件會自動解壓
8-COPY:單純的復(fù)制本地文件到容器中感猛,COPY <src> <dest>
9-ENTRYPOINT:容器啟動后執(zhí)行的命令七扰,并且不可被 docker run 提供的參數(shù)覆蓋,只能有一條命令
? ENTRYPOINT ["executable", "param1", "param2"]
? ENTRYPOINT command param1 param2(shell中執(zhí)行)陪白。
10-VOLUME:創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點颈走,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等,VOLUME ["/data"]
11-USER:容器運行時的用戶名咱士,USER daemon
12-WORKDIR:切換目錄立由,為后續(xù)的 RUN轧钓、CMD、ENTRYPOINT 指令配置工作目錄
13-ONBUILD:配置當(dāng)所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時锐膜,所執(zhí)行的操作指令毕箍,ONBUILD [INSTRUCTION]
# 1 基礎(chǔ)鏡像
FROM centos:centos6
# 2 維護者
MAINTAINER anson.zhang
# 3 安裝基本命令
RUN yum -y update
RUN yum -y groupinstall "Security Tools"
RUN yum -y groupinstall "Debugging Tools"
RUN yum -y groupinstall "Compatibility libraries"
RUN yum -y groupinstall "Development tools"
RUN yum -y groupinstall "Smart card support"
RUN yum -y groupinstall "Base"
RUN yum -y install openssh-clients
RUN yum -y install openssh-server
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 4 安裝jdk
COPY jdk-8u144-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN tar -xvf ./jdk-8u144-linux-x64.tar.gz
RUN mv ./jdk1.8.0_144 jdk
# 4 安裝hadoop
COPY hadoop-2.6.1.tar.gz /usr/local/
RUN tar -xvf ./hadoop-2.6.1.tar.gz
RUN mv ./hadoop-2.6.1 hadoop
# 5 設(shè)置jdk環(huán)境變量
ENV PATH /usr/local/jdk/bin:/usr/local/hadoop/bin:$PATH
# 6 設(shè)置掛載點,或共享卷
VOLUME ["/usr/local/data"]
# 7 使用root登錄Linux
# USER root
# 8 暴露端口
EXPOSE 22 80 8080 8090
# 9 啟動時執(zhí)行的命令
# CMD ["/bin/bash"]
# 映射文件夾道盏,設(shè)置靜態(tài)ip而柑,映射端口,系統(tǒng)時間
# docker run --name hadoop1 --net myIp --ip 172.17.2.1 -itv /software/docker/hadoop1/:/usr/local centos:centos6 /bin/bash
==7. 項目構(gòu)建部署流程==
1. mvn clean compile install -DskipTests
2. docker build -t ...
3. docker images
4. docker tag ...
5. docker push ...
6. docker pull ...
7. docker images
8. docker ps
9. docker stop ...
10. docker rm ...
11. docker run ...
==8. 常見問題==
8.1 瀏覽器訪問不了docker內(nèi)的接口
1.docker啟動時荷逞,docker容器端口要和Java應(yīng)用端口一致
2.訪問時媒咳,要用http://localhost,http://127.0.0.1种远,http://59.110.238.225涩澡,https://58taqu.com,不要用http://192.168.1.48
3.排查 : 查看日志坠敷,curl妙同,端口開放,防火墻
8.2 配置中心訪問出錯
[圖片上傳失敗...(image-1c358f-1551267580996)]
所有的微服務(wù)中添加以下配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
8.3 注意事項
1.application.yml中的經(jīng)常變動的變量不要寫死膝迎,比如用${mysql.address}動態(tài)取值粥帚,啟動命令docker run -it user-service:latest --mysql.address=192.168.1.7
2.寫完Dockerfile后,寫build.sh弄抬,方便以后構(gòu)建茎辐,mvn ... 和 docker build ... 和 docker push ...
8.4 錯誤
1. 這個錯誤用此命令:systemctl restart docker