docker 基礎介紹與實戰
TRANSCRIPT
1
Docker 基礎介紹與實戰Bo-Yi Wu
2016.04.21
2
關於我• https://blog.wu-boy.com• https://github.com/appleboy• https://www.facebook.com/appleboy46
3
為什麼需要使用 Doecker
4
Why• 新人環境建置 ( 蜜月期? )• 多種環境建置及版本測試 – Node 4.x, 5.x ..– PHP 5.6, 5.7 ..–Wordpress, Discourse, Gogs, Gitlab ….
5
多人共用一台 Build Server
6
問題是 …• 宅宅 A: 那個誰誰,可以先停掉你的程序嗎?• 宅宅 B: CPU 跟 Ram 都爆了啦 … .• 宅宅 C: 編譯個 Router Code 要半小時啊
… .• 宅宅 D: 趁半夜沒人的時候再來用 ( 加班
狂? )
7
8
軟體工程師• 做事效率低落• 每天產能有限• 浪費很多時間在 Build Code 上• 如果 Server 壞了,是全 Team 放假嗎?• 週末或平日晚上頻加班 …
9
聊聊 Web 前後端開發環境
10
前端 vs 後端
API Server
前端 Team 後端 Team
Deploy
Deploy
11
如果 API Server 掛掉前端團隊全部都在等
後端工程師修復
12
這時候就需要 Docker 了
13
解決• 工程師不再抱怨 Build Server 慢– 不會再找我麻煩了 ( 誤 )
• 前後端各自獨立作業– 前端各自有獨立開發環境
• 要測試 Service (Wordpress, Jenkins, Gogs)– 不需要安裝任何 redis, mysql, php 等環境
14
What’s Docker?
15
Docker vs. Virtual Machine
16
基本觀念• Docker 映像檔 (Images)• Docker 容器 (Container)• Docker 倉庫 (Repository)
17
Docker Images
Docker container
• 從 images 建立新的 container• 每個容器互相隔離,保證安全• 可寫可讀 (Read, Write)
18
Docker RepositoryDocker 倉庫概念跟 Git 類似
你可以想成類似 Github 託管服務
19
20
Image Image
Container
Container
Docker Registry
Pull
Run Commit
Push
21
Image
Docker Registry
Pull docker pull ubuntu
22
Image
Container
Docker Registry
Pull
Run docker run –t –i ubuntu /bin/bash
23
Image
Container
Container
Docker Registry
Pull
Run
apt-get update
24
Image Image
Container
Container
Docker Registry
Pull
Run Commit
docker commit
25
Image Image
Container
Container
Docker Registry
Pull
Run Commit
Pushdocker push
26
Docker 安裝Mac OS X: https://goo.gl/05XMnB
Linux: https://goo.gl/wRpzlT
28
Docker images
• docker pull ubuntu:14.04– ubuntu: image name– 14.04: tag name, default is “latest”– host: registry.hub.docker.com
列出本機端 imagesdocker images
29
30
31
進入容器內 ( 秒入 )docker run –ti ubuntu:14.04 /bin/bash
root@9cadb3b3e718:/#
32
可以做什麼?做你想做的任何事情
Install nginx, php, mysql ….
33
儲存目前的工作狀態docker commit –m ‘test’ –a ‘Bo-Yi Wu’
9cadb3b3e718 appleboy/test:1.0
34
從上次 commit 進入 bash
docker run –t –i appleboy/test:1.0 /bin/bash
玩壞了沒關係docker run –ti ubuntu:14.04 /bin/bash
35
Demo
36
37
Ubuntu imagesapt-get updateNginx Apache
PHP 5.3
PHP 5.4
PHP 5.6
PHP 5.7
38
Ubuntu imagesapt-get update
docker pull ubuntu:14.04docker run –ti ubuntu:14.04 /bin/bash$ apt-get update && apt-get –y upgrade$ exitdocker commit –m “test” xxxxx test/base:1.0
39
Ubuntu imagesapt-get updateNginx
docker run –ti test/base:1.0 /bin/bash$ install nginx …… $ exitdocker commit –m “test” xxxxx test/nginx:1.0
40
Ubuntu imagesapt-get update
docker run –ti test/base:1.0 /bin/bash$ install apache…… $ exitdocker commit –m “test” xxxxx test/apache:1.0
Apache
41Ubuntu imagesapt-get updateNginx
docker run –ti test/nginx:1.0 /bin/bash$ install php5.3 …… docker commit –m “php” xx test/php:5.3
PHP 5.3
練習前端建立 node 4 及 node 5 環境
後端建立 php6 及 php7 環境驗證 images 是否有該執行檔
42
有沒有覺得打指令很累有沒有一個指令就把 images 建立好?
43
44
這時候你就需要 Dockerfile$ touch Dockerfile
45
46
Dockerfile好理解,易於管理,還可以版控
47
透過 Dockerfile 建立 local images
docker build –t myimage -f Dockerfile .
48
啟動自製 images
49
Ubuntu images
eth0 8000 port
HostDocker bridge
eth0 5467 port
Docker run –d –p 8000 hello
50
Ubuntu images
eth0 8000 port
Hosteth0 80 port
Docker run –d –p 80:8000 hello
Docker bridge
51
Helloeth0 8000 port
HostDocker bridge
eth0 80 port
Docker run –d ––name hello –p 80:8000 hello
52
該如何把目錄 mount 到 Container 內呢?
53
Helloeth0 8000 port
HostDocker bridge
eth0 80 port
Docker run –d –v /opt/test:/home/test ––name hello –p 80:8000 hello
/opt/test
/home/test
54
如何看 Docker logdocker ps
docker logs name
55
如何進入容器docker ps
docker exec –ti name /bin/bash
56
停止 , 啟動容器docker ps
docker stop namedocker start name
docker restart name
57
連接多個服務MySQL, Redis ….
58
Ubuntueth0 8000 port
HostDocker bridge
eth0 80 port
Docker run –d ––link redis:redis –p 80:8000 hello
59
啟動 Mysql, Redis
• docker run –d ––name my-db –e MYSQL_ROOT_PASSWORD=1234 mysql
• docker run –d ––name my-redis redis
60
連接 Mysql 及 RedisDocker run –ti ––link my-db:db \
––link my-redis:redis \ubuntu /bin/bash
61
建立 Wordpress• docker run –d ––name my-db \
–e MYSQL_ROOT_PASSWORD=1234 \mysql
• docker run ––name my-wp \--link my-db:mysql -d \-p 8080:80wordpress
62
如果有 5 個以上服務需要連接呢這時候你就需要 docker-compose.yml
63
wordpress: image: wordpress links: - db:mysql ports: - 8080:80db: image: mariadb environment: MYSQL_ROOT_PASSWORD: test
64
docker-compose 啟動docker-compose up –d
create and start containers
65
docker-compose 列表docker-compose ps
66
用 docker ps 也可以
67
docker-compose
• Docker-compose stop ( 停止服務 )• Docker-compose start ( 啟動服務 )• Docker-compose rm ( 移除全部
container)
68
平行擴展 DB 架構docker-compose scale db=5
69
用 Docker 來測試
70
事前準備• 準備相關環境– Node 4– Node 5– PHP5– PHP6– PHP7
Images
Dockerfile Yoyo/node:4Yoyo/node:5Yoyo/php:6Yoyo/php:7
71
Testing node4
Testing node5
Testing php7
Testing php6
72
Docker run –rm \ –v folder1:folder2 \ --link mysql:mysql \ --workdir=/app \ -e DEV=Testing\ yoyo:node5 \/bin/bash –c “npm test”
74
75
Any Question?