docker 基礎介紹與實戰

Post on 16-Apr-2017

7.304 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

Docker imageshttps://hub.docker.com/

請先申請帳號密碼

27

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”

73

Best Practices Cheat Sheethttps://goo.gl/4CgNkd

74

75

Any Question?

top related