一,docker簡介html
1.docker和kvm的區別node
2.docker基於paas,郵箱就是,go開發,基於內核python
3.更快交付與部署mysql
4.更輕鬆的遷移和擴展(環境一致性)nginx
5.高效的資源利用git
6.docker安裝github
一、簡化配置web
二、代碼流水線管理redis
三、開發效率 (爲開發人員瞬間順被環境)sql
四、應用隔離
五、服務器整合
六、debug能力
七、多租戶
八、快速部署
面向產品: 快速的產品交付
面向開發: 簡化環境配置
面向測試: 多版本測試
面向運維: 環境一致性
面向架構: 自動化擴容(微服務)
一、技術儲備
別人都在搞,咱們公司也不能落後
二、提高自身自身能力
運維人員都會我這也得跟上節奏
三、符合當前業務需求
這點顧名思義
四、無技術棧和技術債
之前從未使用虛擬機等相關技術,而且架構符合SOA鬆耦合
二,docker容器簡單操做
1.docker pull alpine (下載鏡像)
2.docker search nginx(搜索鏡像)
3.docker images(查看本機鏡像)
4.docker save nginx > /tmp/nginx.tar.gz (導出)
5.docker load < /tmp/nginx.tar.gz(導入)
6.docker daemon --help(查看幫助)
7.docker run nginx sh(啓動容器)
8.docker ps (正在運行的容器有哪些)
9.docker ps -a (全部的容器,包括沒有運行的)
10.docker rm 容器ID (刪除容器,可是不能刪除正在運行的容器)
11.docker rm -f (刪除正在運行的容器)
12.docker run -it —name mynginx nginx (—name 自定義容器名)
13.docker inspect 容器名/容器ID (查看容器詳細信息)
14.docker run -it —rm —name mynginx nginx(—rm 退出就刪除容器)
15.docker attach mynginx(進入容器裏面少用)
16.docker exec -it mynginx sh(也是進入容器)
17.docker run -it -d —name mynginx nginx(在後臺運行)
18.docker logs -f mynginx (查看myninx的日誌)
三,docker鏡像製做
簡單製做辦法(不推薦,測試,麻煩)
1.首先pull一個基礎鏡像出來。
2.而後run起來,建立啓動一個容器
3.配置鏡像,安裝nginx
4.配置nginx vi /etc/nginx/nginx.conf,
5.作好後的容器提交成新鏡像
6.啓動本身作的鏡像
7.把本地的鏡像文件上傳到網上https://hub.docker.com
⚠️.本身作鏡像儘可能少安裝包,體積越小越好
⚠️.server端掛,全部容器都掛
⚠️.docker kill xxx
⚠️.docker stop xxx
四,docker網絡入門
docker run -it -d --name mynginx -P nginx
docker run --name mynginx2413 -d -p 80:80 mynginx:v1 nginx
docker run --name mynginx2413 -d -p 80:80/udp mynginx:v1 nginx
docker run --name mynginx2416 -d -p 127.0.0.1:80:80 mynginx:v1 nginx
docker run --name mynginx2416 -d -p 127.0.0.1::80 mynginx:v1 nginx
docker run --name web1 -d -p 8888:80 mynginx:v1 nginx
docker run --name web2 --link web1:shop_web -d -p 8888:80 mynginx:v1 nginx
docker run -it --rm --net=host nginx
docker run -it --rm --net=none nginx
三種驅動方式 sandbox cnm endpont network
五種鏈接方式 bridge(默認+指定) host(默認) ovwelay remote null(默認)
五,docker實現跨主機互聯
環境準備:
宿主機網絡
v1:192.168.1.10
v2:192.168.1.11
docker鏡像網絡
d1:192.168.200.1/28
d2:192.168.101.1/28
/etc/docker/daemon.json文件,添加內容 "bip": "ip/netmask",千萬不要和宿主機在同一個網絡
添加兩條路由:
在v1上面添加
route add -net 192.168.101.0/28 gw 192.168.1.11
在v2上面添加
route add -net 192.168.200.0/28 gw 192.168.1.10
至此,不一樣主機內的容器就能夠互相通訊了
六,docker數據管理
只要在docker run命令後面跟上-
v
參數便可建立一個數據卷,
能夠跟多個-V參數來建立多個數據卷,
建立好數據卷後就能夠經過--volumes-from參數來掛載該數據捲了無論該容器是否運行,也能夠在Dockerfile中經過volume指令來增長一個或則多個數據卷若是有一些數據想在多個容器間共享,或者想在一些臨時性的容器中使用該數據,那麼最好的方案就是你建立一個數據卷容器,而後從該臨時性的容器中掛載該數據卷容器的數據。
這樣,即便刪除了剛開始的第一個數據卷容器或者中間層的數據卷容器,只要有其餘容器使用數據卷,數據卷都不會被刪除的。不能使用docker
export
、save、
cp
等命令來備份數據卷的內容,由於數據卷是存在於鏡像以外的。備份的方法能夠是建立一個新容器,掛載數據卷容器,同時掛載一個本地目錄,
而後把遠程數據卷容器的數據卷經過備份命令備份到映射的本地目錄裏面。以下:
# docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
Docker Volume數據卷能夠實現:
1)繞過「拷貝寫」系統,以達到本地磁盤IO的性能,(好比運行一個容器,在容器中對數據卷修改內容,會直接改變宿主機上的數據卷中的內容,因此是本地磁盤IO的性能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。)
2)繞過「拷貝寫」系統,有些文件不須要在docker commit打包進鏡像文件。
3)數據卷能夠在容器間共享和重用數據
4)數據卷能夠在宿主和容器間共享數據
5)數據卷數據改變是直接修改的
6)數據卷是持續性的,直到沒有容器使用它們。即使是初始的數據卷容器或中間層的數據卷容器刪除了,只要還有其餘的容器使用數據卷,那麼裏面的數據都不會丟失。
備份node
卷中全部的數據爲
test
.
tar
執行完成以後刪除容器--
rm
docker run --
rm
--volumes-from test4 -
v
$(
pwd
):
/backup
ubuntu:14.04
tar
xvf
/backup/test
.
tar
-C /
Volume 只有在下列狀況下才能被刪除:
1)docker
rm
-
v
刪除容器時添加了-
v
選項
2)docker run --
rm
運行容器時添加了--
rm
選項
七,dockerfile編寫(其實也是屬於容器製做)
Dockerfile分爲四部分:基礎鏡像信息、鏡像建立者信息、鏡像操做指令、容器啓動執行指令。
1)FROM(指定基礎image)
2)MAINTAINER(用來指定鏡像建立者信息)
3)RUN(安裝軟件用)
4)CMD(設置container啓動時執行的操做)
5)ENTRYPOINT(設置container啓動時執行的操做)
6)USER(設置container容器的用戶)
7)EXPOSE(指定容器須要映射到宿主機器的端口)
8)ENV(用於設置環境變量)
9)ADD(從src複製文件到container的dest路徑)
10)VOLUME(指定掛載點)
11)WORKDIR(切換目錄)
12)ONBUILD(在子鏡像中執行)
Dockerfile寫好了,須要轉換成鏡像:
進入容器,檢查容器內的nginx程序是否已啓動
編輯好配置以後,記得要重啓容器,使得配置生效
docker restart bobo_nginx
須要注意的是:
1)一旦使用-
v
參數建立容器時添加映射關係後,就必定要當心宿主機映射目錄下的操做,由於此時兩邊時實時同步的,別一不當心就刪除或修改了數據。
2)修改映射文件後,涉及到服務配置文件的,要記得使用docker restart重啓容器,使之生效!
3)一旦容器建立後,啓動報錯,要記得使用docker logs 查看容器日誌
4)在作映射關係前,要先建立一個初始容器,將容器裏要映射的文件或目錄先docker
cp
拷貝到宿主機的對應目錄下,接着刪除初始容器,而後再使用
-
v
參數進行帶有映射目錄關係的容器建立。建立後,就能夠操做宿主機映射後的文件了。
八,docker私庫搭建
1.拉取鏡像
docker pull registry
2.提高安全
cd /opt
mkdir auth
docker run ‐‐entrypoint htpasswd registry:2 ‐Bbn liyongli 123456 > auth/htpasswd (建立用戶名密碼加密數據)
2.建立和啓動一個容器
docker run ‐d ‐p 6000:5000 ‐‐restart=always ‐‐name registry1 \
‐v `pwd`/auth:/auth \
‐e "REGISTRY_AUTH=htpasswd" \
‐e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
‐e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registr
九,docker容器編排
使用Compose 基本上分爲三步:
1.Dockerfile 定義應用的運行環境
2.docker-compose.yml 定義組成應用的各服務
3.docker-compose up 啓動整個應用
安裝Compose
兩種docker-compose安裝方式
a.從github上下載docker-compose二進制文件安裝
b.pip安裝
配置文件詳解
docker-compose.yml 配置文件詳
version: "3" ###Compose目前爲止有三個版本分別爲Version 1,Version 2,Version 3,Compose區分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1沒有聲明版本默認是"version 1"。Version 1未來會被棄用。
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
一份標準配置文件應該包含 version、services、networks 三大部分,其中最關鍵的就是 services 和 networks 兩個部分
3.二、版本
Compose目前爲止有三個版本分別爲Version 1,Version 2,Version 3,Compose區分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1沒有聲明版本默認是"version 1"。Version 1未來會被棄用。
3.三、配置選項
1.bulid
服務除了能夠基於指定的鏡像,還能夠基於一份 Dockerfile,在使用 up 啓動之時執行構建任務,這個構建標籤就是 build,它能夠指定 Dockerfile 所在文件夾的路徑。Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像啓動服務容器
build: /path/to/build/dir
也能夠是相對路徑
build: ./dir
設定上下文根目錄,而後以該目錄爲準指定 Dockerfile
build:
context: ../
dockerfile: path/of/Dockerfile
2. context
context 選項能夠是 Dockerfile 的文件路徑,也能夠是到連接到 git 倉庫的url,當提供的值是相對路徑時,它被解析爲相對於撰寫文件的路徑,此目錄也是發送到 Docker 守護進程的 context
build:
context: ./dir
3. dockerfile
使用此 dockerfile 文件來構建,必須指定構建路徑
build:
context: .
dockerfile: Dockerfile-alternate
4.image
services:
web:
image: nginx
在 services 標籤下的第二級標籤是 web,這個名字是用戶本身自定義,它就是服務名稱。
image 則是指定服務的鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
例以下面這些格式都是能夠的:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: a4bc65fd
5. args
添加構建參數,這些參數是僅在構建過程當中可訪問的環境變量
首先, 在Dockerfile中指定參數:
ARG fendo
ARG password
RUN echo "Build number: $fendo"
RUN script-requiring-password.sh "$password"
而後指定 build 下的參數,能夠傳遞映射或列表
build:
context: .
args:
fendo: 1
password: fendo
或
build:
context: .
args:
- fendo=1
- password=fendo
指定構建參數時能夠省略該值,在這種狀況下,構建時的值默認構成運行環境中的值
args:
- fendo
- password
6.command
使用 command 能夠覆蓋容器啓動後默認執行的命令。
command: bundle exec thin -p 3000
該命令也能夠是一個列表,方法相似於 dockerfile:
command: ["bundle", "exec", "thin", "-p", "3000"]
7.container_name
Compose 的容器名稱格式是:<項目名稱><服務名稱><序號>
雖然能夠自定義項目名稱、服務名稱,可是若是你想徹底控制容器的命名,可使用這個標籤指定:
container_name: app
這樣容器的名字就指定爲 app 了。
8.depends_on
在使用 Compose 時,最大的好處就是少打啓動命令,可是通常項目容器啓動的順序是有要求的,若是直接從上到下啓動容器,必然會由於容器依賴問題而啓動失敗。
例如在沒啓動數據庫容器的時候啓動了應用容器,這時候應用容器會由於找不到數據庫而退出,爲了不這種狀況咱們須要加入一個標籤,就是 depends_on,這個標籤解決了容器的依賴、啓動前後的問題。
例以下面容器會先啓動 redis 和 db 兩個服務,最後才啓動 web 服務:
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意的是,默認狀況下使用 docker-compose up web 這樣的方式啓動 web 服務時,也會啓動 redis 和 db 兩個服務,由於在配置文件中定義了依賴關係。
9.pid
pid: "host"
將PID模式設置爲主機PID模式,跟主機系統共享進程命名空間。容器使用這個標籤將可以訪問和操縱其餘容器和宿主機的名稱空間。
10.ports
映射端口的標籤。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機會隨機映射端口。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:當使用HOST:CONTAINER格式來映射端口時,若是你使用的容器端口小於60你可能會獲得錯誤得結果,由於YAML將會解析xx:yy這種數字格式爲60進制。因此建議採用字符串格式。
11.extra_hosts
添加主機名的標籤,就是往/etc/hosts文件中添加一些記錄,與Docker client的--add-host相似:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
啓動以後查看容器內部hosts:
162.242.195.82 somehost
50.31.209.229 otherhost
12.volumes
掛載一個目錄或者一個已存在的數據卷容器,能夠直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式,後者對於容器來講,數據卷是隻讀的,這樣能夠有效保護宿主機的文件系統。
Compose的數據卷指定路徑能夠是相對路徑,使用 . 或者 .. 來指定相對目錄。
數據卷的格式能夠是下面多種形式:
volumes:
// 只是指定一個路徑,Docker 會自動在建立一個數據卷(這個路徑是容器內部的)。
- /var/lib/mysql
// 使用絕對路徑掛載數據卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件爲中心的相對路徑做爲數據卷掛載到容器。
- ./cache:/tmp/cache
// 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
// 已經存在的命名的數據卷。
- datavolume:/var/lib/mysql
若是你不使用宿主機的路徑,你能夠指定一個volume_driver。
volume_driver: mydriver