Ubuntu 使用 docker 筆記

Agenda

  • Foreword
  • Introduction
  • Concept
  • Run Docker

Foreword

研究 Docker 的起因

  • 虛擬機每次要重新建置一樣的環境,需要很長的時間
  • 虛擬機比較難模擬真實環境,因資源需求較高
  • 承上,虛擬機執行的數量會受限於本機資源
  • 環境一旦複雜,設定會很困難。

Introduction

  • Docker 能做什麼事
  • Docker 怎麼辦到的

虛擬機能做的幾乎都能做得到

  • 隔離應用
  • 儲存在發布
  • 具備可攜性
  • 環境即程式碼

Concept

  • 映像檔 - Image (git log/Vagrant Box)

  • 容器 - Container (Staging / Running VM)

  • 倉庫 - Repository (GitHub /VagrantCloud)

  • 使用 Docker Container 很像虛擬機

    • 虛擬 IP、Port Forwarding…
  • 管理 Docker Image 的觀念很像 Git

    • commit、pull、push…

Run Docker

Installation

  • Linux 懶人安裝指令
$curl -sSL https://get.docker.com/ | sudo sh
  • Windowss 10 和 Mac 也都能直接裝(since 1.12)

Commands

Command Note
docker pull 下載映像檔
docker images 看目前有哪些映像檔
docker rmi 刪除映像檔
docker run 建立容器並執行指令
docker start/stop/restart 操作容器
docker ps 看目前有哪些容器正在執行
docker rm 刪除容器

Command - Hello world

$docker run -d nginx
$docker run -d nginx:1.11-alpine
$docker images
$docker ps
$docker stop
$docker rm

Command - Port forwarding

$docker run -d --name my-nginx -p 0.0.0.0:8080:80 nginx
# --name: 容器名稱
# -p: 設定連接port,格式[hostIP]:[hostPort]L[ContainerPort]
$docker stop my-nginx
$docker rm -f my-nginx
# 加入 -f 才能把正在執行的容器刪除

Command - Run PHP command

$docker -run --rm -it php php -v

--rm: 執行完指令就把容器刪除
-it: 開啟互動和終端機輸出,執行過程中有輸入就需要這兩個選項
php: 映像檔,沒有tag的話,預設會用 latest 版本
php -v: 要在容器執行的命令

Command - Run local programn

$echo "" > hw.php
$docker run -v `pwd`:/var/www/html php php /var/www/html/hw.php
# -v: 掛載檔案到容器,參數格式 [/host]:[/container]
# php /var/www/html/hw.php: 執行 php
# -w path 更改工作目錄

Command - Environment

$docker run -d -p 0.0.0.0:3306:3306 -e MYSQL_ROOT_PASSWORD=passwrod mariadb:5.5
# -d: 背景執行
# -e: 設定環境變數
$docker logs
# 即可看到背景執行時的 狀況
$docker run -d --name cache -d memcached
$docker run -d --name my-nginx --link cache:c nginx
$docker exec -it my-nginx bash
# apt-get install telnet
# telnet c 11211
# --Link: 連接到某個容器,格式 [容器名]:[別名]

Conclusion

  • Docker 可快入建立一個以定義好的環境
  • 開發與測試非常適合使用

Troubleshooting

  1. How can I use docker without sudo ?
# Add the docker group if it doesn't already exist:
$sudo groupadd docker
groupadd: group 'docker' already exists
# Add the connected user "[USER]" to the docker group.
# Change the user name to match your preferred user if you do not want to use your current user:
$sudo gpasswd -a [USER] docker
Adding user [USER] to group docker
$newgrp docker
$docker run hello-world

  目錄