==1. 概念==
1.1 Docker鏡像 - Docker Images
容器運行時的只讀模板,操作系統 + 軟件運行環境 + 用戶程序
class User {
private String username;
private Integer age;
}
1.2 Docker 容器 - Docker Containers
容器包含了某個應用運行所需要的全部環境
User user = new User();
1.3 Docker 倉庫 - Docker Registeries
用來保存鏡像,有公有和私有倉庫,比如Maven的中央倉庫和本地私服
[圖片上傳失敗...(image-e74e3-1551267580996)]
1.4 Tips
Docker Images : Java Class
Docker Containers : Java Object
通過類創建對象,通過鏡像創建容器
==2. 常見命令==
1.搜索鏡像 : docker search rabbitmq:management
2.查看系統鏡像 : docker images
3.拉取鏡像 : docker pull rabbitmq:management
rabbitmq:management是具體鏡像名稱(格式 REPOSITORY:TAG)
REPOSITORY : 表示鏡像的倉庫源
TAG : 鏡像的標簽
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.查看當前運行的容器 : docker ps
6.檢查容器內部信息 : docker inspect id/name
7.刪除鏡像 : docker rmi 鏡像名稱
-f : 強制刪除
8.刪除某個容器 : docker rm id/name(容器必須是停止狀態)
9.停止某個容器 : docker stop id/name
10.啟動某個容器 : docker start id/name
11.查看啟動日志 : docker logs -f id/name
12.在容器里面進行操作 : docker exec -it nginx /bin/bash
13.構建鏡像 : docker build -t eureka-server .
14.查看所有的容器 : docker ps -a
15.復制Linux到docker-文件 : docker cp nginx.conf my-nginx:/etc/nginx/nginx.conf
16.復制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存儲位置和驅動 : 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 : 創建
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. 復制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 構建鏡像
mvn install -DskipTests dockerfile:build
5.4 推送鏡像到倉庫
登錄倉庫 : docker login --username=anson.zhifu@gmail.com registry.cn-beijing.aliyuncs.com
鏡像打標簽 : 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:基于什么鏡像,FROM <image>或FROM <image>:<tag>
2-MAINTAINER:維護者信息,MAINTAINER <name>
3-RUN:在基礎鏡像上執行,搭建環境,RUN <command> 或 RUN ["executable", "param1", "param2"]
4-CMD:啟動容器時執行的命令,只能有一條
? CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
? CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
? CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
5-EXPOSE:容器暴露的端口號,EXPOSE <port> [<port>...]
6-ENV:指定環境變量,會被后續的RUN指令使用,并在容器運行時保持
7-ADD:就是復制文件到容器中,ADD <src> <dest>,<src>:可以是一個本地文件,可以是URL,tar文件會自動解壓
8-COPY:單純的復制本地文件到容器中,COPY <src> <dest>
9-ENTRYPOINT:容器啟動后執行的命令,并且不可被 docker run 提供的參數覆蓋,只能有一條命令
? ENTRYPOINT ["executable", "param1", "param2"]
? ENTRYPOINT command param1 param2(shell中執行)。
10-VOLUME:創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等,VOLUME ["/data"]
11-USER:容器運行時的用戶名,USER daemon
12-WORKDIR:切換目錄,為后續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄
13-ONBUILD:配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令,ONBUILD [INSTRUCTION]
# 1 基礎鏡像
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 設置jdk環境變量
ENV PATH /usr/local/jdk/bin:/usr/local/hadoop/bin:$PATH
# 6 設置掛載點,或共享卷
VOLUME ["/usr/local/data"]
# 7 使用root登錄Linux
# USER root
# 8 暴露端口
EXPOSE 22 80 8080 8090
# 9 啟動時執行的命令
# CMD ["/bin/bash"]
# 映射文件夾,設置靜態ip,映射端口,系統時間
# docker run --name hadoop1 --net myIp --ip 172.17.2.1 -itv /software/docker/hadoop1/:/usr/local centos:centos6 /bin/bash
==7. 項目構建部署流程==
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內的接口
1.docker啟動時,docker容器端口要和Java應用端口一致
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)]
所有的微服務中添加以下配置
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中的經常變動的變量不要寫死,比如用${mysql.address}動態取值,啟動命令docker run -it user-service:latest --mysql.address=192.168.1.7
2.寫完Dockerfile后,寫build.sh,方便以后構建,mvn ... 和 docker build ... 和 docker push ...
8.4 錯誤
1. 這個錯誤用此命令:systemctl restart docker
image