docker基礎知識
映象是大家制作的程式包,裡面可以只有 linux 環境,也可以包含特定的軟體。
$ docker image ls # 列出本地所有映象 $ docker image rm [imageName] # 刪除制定映象 $ docker image pull hello-world # 下載映象到本地
容器
容器是執行中的映象。docker 會把映象複製一份,然後執行。
$ docker container run hello-world
hello-world 是 docker 官方的映象。如果沒有執行 image pull,會自動下載。
因為容器是映象複製出來的,所以一旦執行後,也會有檔案生成
$ docker container ls # 列出執行中的容器 $ docker container ls --all # 包括沒在執行的容器 $ docker container rm [containerId] # 刪除容器檔案
開一個可互動的 nginx 容器
$ docker container run \ -d \ # 後臺執行 -p 127.0.0.1:8080:80 \ # 容器內的 80 埠對映到本地8080埠 -p 127.0.0.1:8081:443 \ # 容器內的 443 埠對映到本地8081埠 --rm \ # 停止執行後刪除容器 --name mynginx \ #容器命名為mynginx --volume "$PWD/html":/usr/share/nginx/html \ #對映檔案目錄到本地 --volume "$PWD/conf":/etc/nginx \ #對映配置檔案到本地 nginx
針對 linux
$ sudo groupadd docker # 新增 docker 組 $ sudo usermod -aG docker $USER # 將使用者新增到 docker 組 $ sudo systemctl start docker # systemctl 開啟服務 $ sudo service docker start # 或者 service 開啟服務
Dockerfile
下面來做一個 swoole 本地開發 dockerfile
# 在 PHP 官方映象基礎上構建 FROM php:7.2-cli # 複製本地檔案到 /tmp COPY swoole.tar.gz /tmp # 指定接下來的工作目錄 WORKDIR /app RUN tar -xzf /tmp/swoole.tar.gz -C /tmp/swoole --strip-components=1 \ && phpize \ && ./configure \ && make \ && make install \ && docker-php-ext-enable \ && rm -f /tmp/swoole.tar.gz \ && rm -f /tmp/swoole \ # 對映檔案 VOLUME ["/app","/www"] # 暴露 8081 埠 EXPOSE 8081
編譯執行
$ docker image build -t swoole-dev . # -t 後面跟映象的名字 $ docker container run -p 8000:3000 swoole-dev
Docker Compose
如果我們有多個服務,比如 wordpress + mysql,這個時候要先啟動 mysql,然後根據 mysql 的 ip,改變 wordpress 的配置。這種情況,就要用到 docker compose 了。下面是一個例子
# 檔案 docker-compose.yml mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWOD=123456 - MYSQL_DATABASE=wordpress web: image: wordpress links: - mysql environment: - WORDPRESS_DB_PASSWORD=123456 ports: - "127.0.0.1:8080:80" working_dir: /var/www/html volumes: - wordpress: /var/www/html
執行
$ docker-compose up # 啟動所有服務 $ docker-compose stop # 關閉所有服務 $ docker-compose rm # 刪除容器
其他有用的命令
$ docker container start [containerId] #啟動容器 $ docker container stop [containerId] #停止容器,先發出 SIGTERM 訊號,然後發出 SIGKILL 訊號 $ docker container kill [containerId] # 殺死執行中的容器,發出 SIGKILL 訊號 $ docker container logs [containerId] # 檢視 shell 輸出 $ docker container exec -it [containerId] /bin/bash # 進入到容器內部 linux 環境 $ docker container cp [containerId]:[/path/to/file] # 複製容器 $ docker container inspect [containerId] # 檢視容器 IP 地址