一、Docker的安裝和啟動 使用環境centos7 1. yum包更新到最新 2. 安裝需要的軟體包,yum util提供yum config manager功能 3. 設置yum源為阿裡雲 4. 安裝docker 5. 安裝查看docker版本 6. 設置 docker鏡象拉取提供者 7. 啟動 ...
一、Docker的安裝和啟動
使用環境centos7
yum包更新到最新
sudo yum update
安裝需要的軟體包,yum-util提供yum-config-manager功能
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
設置yum源為阿裡雲
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝docker
sudo yum install docker-ce
安裝查看docker版本
docker -v
設置 docker鏡象拉取提供者
編輯文件:vi /etc/docker/daemon.json 在該文件中輸入: { "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] }
啟動、重啟、停止、加入服務
systemctl start docker 啟動 systemctl status docker 查看狀態 systemctl enable docker 開機自啟動
鏡像相關的命令
查看鏡像 docker images 搜索 docker search nginx 拉取 docker pull nginx 刪除 (有運行的容器不能刪除) docker rmi 鏡像ID 刪除所有 docker rmi `docker imgaes -q`
二、容器相關的命令
查看運行中的容器
docker ps docker ps -a 查看沒有運行和運行的
創建與啟動容器
2.1 創建容器命令:docker run -i : 表示運行容器 -t :表示容器啟動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個偽終端 --name:為創建的容器命名 -v : 表示目錄映射關係(前者是宿主機器目錄,後者是映射到宿主機上的目錄)可以使用多個 -v做多個目錄或文件映射 註意:最好做目錄映射,在宿主機上做修改然後共用到容器上 -d : 在run後面加上-d參數,則會創建一個守護式容器運行在後臺(這樣創建的容器不會自動登錄到容器) -p : 表示埠映射,前者是宿主機器埠。後者是容器內的映射埠,可以使用多個 -p 做多個埠映射
2.2 互動式方式創建容器
docker run -it --name=容器名稱 鏡像名稱:標簽 /bin/bash 例:docker run -it --name=mycentos centos:7 /bin/bash 退出當前容器 exit
2.3 守護式方式創建容器
docker run -id --name=容器名稱 鏡像名稱:標簽 例如: docker run -id --name=mycentos2 centos:7 進入容器 docker exec -it 容器名稱 /bin/bash 退出當前容器 exit 例如:docker exec -it mycentos2 /bin/bash
2.4 啟動容器與停止容器
停止容器: docker stop 容器名稱(或者容器ID) 啟動容器: docker start 容器名稱 (或者容器Id)
2.5 文件拷貝( 如果我們需要將宿主機文件拷貝到容器裡面 )
宿主機 ---> 容器 docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄 例:docker cp anaconda-ks.cfg mycentos2:/usr/local 容器文件 ----> 宿主機器 docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄 例:docker cp mycentos2:/usr/local/anaconda-ks.cfg anaconda-ks.cfg
2.6 目錄掛載(將宿主的目錄與容器內目錄進行映射,這樣我們就可以通過修改宿主機器某個目錄的文件去影響容器的文件)
創建容器 添加-v參數 後邊為 宿主機器目錄:容器目錄, 例: docker run -di --name=mycentos3 -v /home/myhtml:/home/myhtml centos:7 如果許可權不足提示: 因為centos7的安全模塊selinux把許可權禁止掉了。我們需要添加參數 -privileged=true來解決目錄沒有許可權的問題
2.7 查看容器的IP
查看容器信息: 例:docker inspect mycentos3 查看容器的ip信息:(格式化提取) 例:docker inspect --format="{{.NetworkSettings.IPAddress}}" mycentos3 移除容器 (不能移除正在運行的) 例:docker rm mycentos3
三、docker應用部署
- mysql部署
1.1 拉取mysql鏡像
docker pull centos/mysql-57-centos7
1.2 創建容器
docker run -di --name=cason_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql centos/mysql-57-centos7 -p 代表埠映射,格式為 宿主機映射埠:容器運行埠 -e 代表添加環境變數, MYSQL_ROOT_PASSWORD 是root用戶的登陸密碼
1.3 進入mysql容器
docker exec -it cason_mysql /bin/bash
1.4 登陸mysql
mysql -u root -p
1.5 遠程登陸mysql
連接宿主機的IP,指定埠為33306 - tomcat部署
2.1 拉取鏡像
docker pull tomcat:7-jre7
2.2 創建容器
docker run -di --name=cason_tomcat -p 10001:8080 -v /home/local/webapps:/usr/local/tomcat/webapps tomcat:8-jre8
- /home/local/webapps 代表宿主機目錄
- /usr/local/tomcat/webapps 容器tomcat的部署目錄
- 部署nginx
3.1 拉取鏡像 docker pull nginx
3.2 創建鏡像 docker run -di --name=mynginx -p 80:80 nginx 部署redis
4.1 拉取鏡像 docker pull redis
4.2 創建鏡像 docker run -di --name=myredis -p 6379:6379 redis
四、docker遷移與備份
- 容器保存為鏡像
docker commit cason_nginx caosn_nginx_1 - 鏡像備份(cason_nginx.tar文件導出在當前目錄)
docker save -o cason_nginx.tar cason_nginx_2 - 鏡像回覆
docker load -i cason_nginx.tar
六、Dockerfile
概念:Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於 基礎鏡像並最終創建一個新的鏡像
1、對於開發人員:可以為開發團隊提供一個完全一致的開發環境
2、對於測試人員:可以直接拿開發時構建的鏡像或通過Dockerfile構建一個新鏡像
3、對於運維人員:在部署時,可以實現應用的無縫一致- 常用命令:
命令 作用
FROM image_name:tag 定義了使用哪個基礎鏡像啟動構建流程
MAINTAINER user_name 聲明鏡像的創建者
ENV key value 設置環境變數(可以寫多條)
RUN command 是Dockerrfile的核心部分(可以寫多條)
ADD source_dir/file 將宿主機的文件複製到容器。如果是一個壓縮文件,將會複製到容器中自動解壓
COPY source_dir/file 和ADD像是 。但如果有壓縮文件並不能解壓
WORKDIR path_dir 設置工作目錄 使用腳本創建鏡像的
例如構建一個jdk8的centos7鏡像:
Dockerfile腳本如下:
```
FROM centos:7
MAINTAINER cason
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u172-linux-x64.tar.gz /usr/local/java/ENV JAVA_HOME /usr/local/java/jdk1.8.0_172 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/bin/dt.jar$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH
```
同時在當前目錄添加 jdk-8u172-linux-x64.tar.gz 安裝包腳本完成後執行構建:
docker build -t='jdk1.8' .
-t 代表指定構建後的docker的名稱
. 點代表指定當前目錄docker 啟動 web 示例報錯如下:
Error response from daemon: Cannot start container web: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 32797 -j DNAT --to-destination 172.17.0.30:5000 ! -i docker0: iptables: No chain/target/match by that name.
解決辦法:重建docker0網路恢復pkill docker # 殺死docker進程 iptables -t nat -F # 清空規則鏈的(註意每個鏈的管理許可權) ifconfig docker0 down # 停止docker0的ip連接 brctl delbr docker0 # 重新橋接docker0的網路 docker -d # 開啟Daemon模式。 service docker restart # 重啟docker
七、Docker私有庫
私有倉庫的搭建與配置
1.1 拉取私有倉庫鏡像 docker pull registry
1.2 創建私有倉庫容器 docker run -di --name=registry -p 5000:5000 registry
1.3 創建成功後 在瀏覽器輸入:宿主機IP+5000埠 例如 http://192.168.110.141:5000/v2/_catalog
查看到了 {"repositories":[]} 表示成功並且內容為空
1.4 修改daemon.json
vi /etc/docker/daemon.json 添加內容
{"insecure-registries":["192.168.110.141:5000"]}
1.5 重啟docker
systemctl restart docker
鏡像上傳至私有倉庫
2.1 標記鏡像為私有倉庫的鏡像
docker tag jdk1.8 192.168.110.141:5000/jdk1.8
2.2 上傳標記的鏡像 (要保證私庫的容器正在運行著)
docker push 192.168.110.141:5000/jdk1.8
八、DockerMaven插件
Maven插件自動部署步驟:(配置:https://www.cnblogs.com/atliwen/p/6101946.html)
- 修改宿主機器的docker的配置,讓其可以遠程訪問
vi /lib/systemd/system/docker.service
添加部分是:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改為:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
刷下docker配置
systemctl daemon-reload systemctl restart docker docker start registry
在pom.xml文件添加 docker配置
<build> <finalName>app</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- docker的maven插件,官網 https://github.com/spotify/docker-maven-plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>192.168.110.141:5000/${project.artifactId}:${project.version}</imageName> <!--<dockerDirectory>src/main/docker</dockerDirectory>--> <baseImage>java:8</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <dockerHost>http://192.168.110.141:2375</dockerHost> </configuration> </plugin> </plugins> </build>
以上配置會自動生成Dockerfile
FROM jdk1.8 ADD aap.jar / ENTRYPOINT ["java","-jar","/app.jar"]
在windows的命令提示符下,進入當前工程的目錄 ,輸入以下命令 打包上傳鏡像
命令:mvn clean package docker:build -DpushImageI/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: Broken pipe 導致這個錯誤的原因是 project.artifactId 可能包含了大寫
- 創建容器
docker run -di --name=base -p 8088:8088 192.168.110.141:5000/springboot-demo:1.0.0-SNAPSHOT
埠8088 因為springboot-demo項目的埠就是8088 直接瀏覽器輸入 http://192.168.110.141:8088/user/1 這就是訪問docker裡面的boot項目