文章目錄
一、安裝docker
1、安裝依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
2、設置docker安裝源
有國外的和阿里雲兩個可以選(二選一), 因爲國外的比較慢,可以選國內的阿里雲鏡像源
國外鏡像源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
阿里雲鏡像源:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
3、安裝社區版Docker-CE
yum install -y docker-ce
4、啓動docker
設置開機啓動:
systemctl enable docker
啓動docker
systemctl start docker
測試是否成功
docker有一個測試用的hello world鏡像
docker run hello-world
5、配置鏡像加速器
國內下載較慢,可以配置鏡像加速器,如果沒開通過這個服務需要創建一個鏡像,按照提示操作即可。
直接在虛擬機中運行阿里雲控制檯中提示的命令即可。
6、拉取鏡像
從daocloud上拉取鏡像https://hub.daocloud.io/
註冊賬號,登陸搜索鏡像
選擇版本後拉取:
二、docker鏡像
輸入docker 能看到提示的命令:
1、搜索鏡像
搜索幫助
docker search --help
查看docker鏡像
docker images
現在本機沒有鏡像,可以下載鏡像。可以進行搜索
docker search 關鍵字 --limit 條數
比如找nginx鏡像
3、安裝鏡像
拉取java鏡像,如果不寫版本號就默認下載最新版本
docker pull 鏡像版本
版本可以去官網查看https://hub.docker.com/
安裝鏡像
如果一個鏡像的名不能直接說明它的信息,可以通過命令修改tag:
docker tag IMAGEID 新鏡名稱:新標籤
3、刪除鏡像
刪除之前要保證鏡像沒有被任何容器使用,如果有容器需要先刪除容器
docker rmi 鏡像名:版本
docker rmi nginx:latest
4、備份鏡像
再安裝一個nginx鏡像
docker pull nginx
備份本地鏡像倉庫
docker save -o nginx.img.tar nginx
5、導入鏡像
docker load -i nginx.img.tar
三、docker容器
1、啓動容器
docker run 參數 鏡像名稱:tag
運行一個容器時,若只是指定了鏡像名,而沒有指定其tag,docker默認會以tag爲latest(最新版本)的鏡像去啓動容器,假如本地不存在這個鏡像則先會報錯;之後會嘗試下載這個鏡像,下載成功後再次運行容器和所要執行的命令。
後臺啓動容器
docker run -itd 鏡像:版本
或者
docker run -itd 鏡像id
-itd運行一個在後臺執行的容器,同時,還能用控制檯管理
2、停止容器
docker stop 容器id
docker ps -a
:可以列出所有容器,包括未運行的容器
docker rm 容器id
:刪除容器
docker start 容器id
:啓動一個容器
docker restart 容器id
:重新啓動一個容器
3、端口映射
映射端口,docker的網絡和宿主機網絡不在一個網段,不能直接訪問,需要進行端口映射
docker run -itd -p 宿主機端口:docker端口 鏡像id
如:新建容器啓動nginx
docker run -itd -p 80:80 2622e6cca7eb
停止nginx服務
docker stop 1da4608e1cc9
4、容器命名
docker容器在啓動的時候有個名字隨機的名字,名字是唯一的,用於區分容器.通過容器的name也可以操作容器,作用和容器id是一樣的。可以自己指定容器的名字:
docker run -itd --name 新名字
如端口映射啓動nginx並指定容器名稱
docker run -itd --name nginx1 -p 80:80 2622e6cca7eb
通過容器名停止容器
docker stop nginx1
重命名容器
docker rename 原名字 新名字
5、其它命令
查看本地所有容器(包括未運行的):
docker ps -a
查看最近一次啓動的容器(不論現在是啓動還是停止):
docker ps -l
查看正在運行的容器id
docker ps -q
查看所有容器id
docker ps -aq
查看容器的元數據信息,有啓動時執行的命令或程序、運行時的IP、所使
用的鏡像等:
docker inspect <容器ID|容器名>
查看容器ip:
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id
刪除容器
docker rm 容器id
在宿主機直接運行容器中的命令
docker exec 容器名/容器 ID(不是鏡像名/鏡像ID) 執行的命令 [參數]
如:
docker exec amazing_elion cat /etc/redhat-release
查看日誌
docker logs 容器id|容器名
可以通過使用docker logs命令來查看容器的運行日誌
--tail
:選項可以指定查看最後幾條日誌
-t
:選項則可以對日誌條目附加時間戳。
--until
:顯示在某個時間戳(例如:2018-05-25T 13:23:37)之前的日 志,還可以相對時間(例如:42m 42 minutes )
在宿主機和容器之間傳遞文件:
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
將容器中的centos7.4:/root/a.txt 複製到宿主機當前路徑.(最後那個.
是宿主機當前路徑)
docker cp centos7.4:/root/a.txt .
把宿主機當前路徑下的a.txt傳回容器:
docker cp ./a.txt centos7.4:/root/a.txt
在宿主機查看容器的變化:
docker diw 容器id
[root@localhost ~]# docker diff 78d A /change_dir A /change_dir/file.txt C /root A /root/.bash_history A /test
A 表示在原來的基礎上,做了添加
C 表示在原來的基礎上,做了改變
四、數據卷
如果刪除容器,那麼容器中的東西就都刪除了。我們可以把文件存在宿主機,這樣刪掉容器之後,文件還在宿主機上。數據卷可以在多個容器之間共享。並且直接在容器中修改文件,如果文件錯誤,會造成容器無法啓動,宿主機不能進入未啓動的容器,也就不能再修正錯誤的文件了,這個容器就廢掉了。如果文件掛載到外部,可以直接在宿主機修改。
以mysql鏡像爲例
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.24
-v
宿主機目錄:鏡像目錄 是把鏡像中對應的文件掛載宿主機目錄中
-e
容器啓動時的參數
-d
鏡像,如果本地沒有,則會自動拉取鏡像
docker stop mysql 停止容器,此時不能再連接到數據庫了
docker rm mysql 刪除容器
再用上面相同的方式開啓一個容器,再次連接數據庫,可以看到數據都在。
五、自定義鏡像
容器是一個靜態環境,鏡像中它是什麼樣子,運行起來就是什麼樣,是不能改變的。如果想在容器中運行寫好的項目,需要把項目打包發佈出去。
這時需要自定義鏡像。
自定義鏡像,使用Dockerfile,注意沒有後綴名
例如有一個打好的包,boot.jar,上傳到宿主機的/usr/local/docker下放的是一個springboot的jar包,運行的時候會返回文字(代碼不重要,寫什麼都可以)
package com.boot.test;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("index")
public String index(){
return "hello Docker";
}
}
如果在服務器直接運行 是java -jar boot.jar
如果想在容器中運行,需要創建Dockerfile
vim Dockerfile
內容
FROM java
COPY boot.jar /
CMD java -jar /boot.jar
FROM 鏡像名
COPY 宿主機文件 鏡像位置
CMD 在鏡像中需要執行的命令
使用java鏡像
複製boot.jar到docker的根目錄下
執行cmd運行jar包
注意複製的文件和Dockerfile在一個目錄下面,不能寫宿主機絕對路徑,否則會報錯
構建鏡像 -t代表target,testdocker是自定義的鏡像名,最後的.代表當前路徑
docker build -t testdocker .
啓動鏡像
docker run -itd -p 8080:8080 d1d5bed4d8ea
訪問對應的端口和請求路徑就能看到結果
查看日誌
docker logs 容器id
可以查看啓動過程,和本機運行的控制檯是一樣的
六、發佈鏡像
先登錄docker hub,如果沒賬號的話,可以先註冊一個
創建自己的鏡像
創建完之後會有個路徑,一般是 用戶名/倉庫名
docker push 路徑
需要注意的是本地的倉庫需要帶着路徑,如果本地鏡像叫aa,你的用戶名叫user,那麼路徑就是user/aa
本地原來叫aa,需要重命名成user/aa,否則會報錯
重命名:
docker tag 鏡像id 用戶名/鏡像名:版本
把Dockerfile 推送到docker hub
七、docker compose
docker compose負責快速部署分佈式
安裝命令:
sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
最後一步如果下載不下來,就換一個地址:
git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout git describe --abbrev=0 --tags
卸載
sudo rm /usr/local/bin/docker-compose
常用命令
前臺運行:docker-compose up
後臺運行:docker-compose up -d
啓動:docker-compose start
停止:docker-compose stop
停止並移除容器:docker-compose down
默認的模板文件名稱爲:docker-compose.yml
,格式爲 YAML 格式。、
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
version 是語言版本
service 是服務
webapp是服務名,名字可以自定義
image 是使用的鏡像
ports 是端口映射
volumes 是數據卷
安裝tomcat
例如,使用docker-compose安裝tomcat
創建docker-compose.yml文件
version: '3.1'
services:
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5-jre8-slim
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment:
TZ: Asia/Shanghai
保存之後運行命令,如果本地沒有鏡像會下載
docker-compose up -d
訪問宿主機的8080端口可以看到tomcat界面
安裝mysql
安裝mysql5.7.24
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.7.24
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
安裝mysql8
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
如果想同時安裝mysql和tomcat,可以寫到一個docker-compose.yml中
version: '4.1'
services:
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5-jre8-slim
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment:
TZ: Asia/Shanghai
mysql:
restart: always
image: mysql:5.7.24
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
八、使用docker安裝gitlab
使用Docker來安裝和運行Gitlab中文版,由於新版本問題較多,這裏使用目前相對穩定的10.5版本,docker-compose .yml配如下:
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh:10.5'
restart: always
hostname: '121.196.62.166'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://121.196.62.166:8080'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
這裏雲服務器是2g內存帶不動,gitlab耗內存,3g內存可以打開