天天看點

如何在雲伺服器上部署docker容器

**使用docker rmi或docker image rm指令可以删除鏡像,指令格式為docker rmiIMAGE [IMAGE...],其中IMAGE可以為标簽或ID。

  • -f, -force:強制删除鏡像,即使有容器依賴它;
  • -no-prune:不要清理未帶标簽的父鏡像。

例如,要删除掉myubuntu:latest鏡像,而nginx:1.14.2則不會被删除。可以使用如下指令:

[root@womr-c ~]# docker rmi mynginx:latest 
Untagged: mynginx:latest           

鏡像ID删除鏡像

[root@womr-c ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ubuntu       18.04     2c047404e52d   2 months ago    63.3MB
nginx        1.14.2    295c7be07902   22 months ago   109MB
[root@womr-c ~]# docker rmi -f 2c047404e52d
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:fd25e706f3dea2a5ff705dbc3353cf37f08307798f3e360a13e9385840f73fb3
Deleted: sha256:2c047404e52d7f17bdac4121a13cd844447b74e13063f8cb8f8b314467feed06           

清理鏡像

使用Docker一段時間後,系統中可能會遺留一些臨時的鏡像檔案,以及一些沒有被使用的鏡像,可以通過docker image prune指令來進行清理。

  • -a, -all:删除所有無用鏡像,不光是臨時鏡像;
  • -filter filter:隻清理符合給定過濾器的鏡像;
  • -f, -force:強制删除鏡像,而不進行提示确認

例如自動清理臨時遺留鏡像檔案層,最後會提示釋放的存儲空間

[root@womr-c ~]# docker image prune -f
Total reclaimed space: 0B           

建立鏡像

建立鏡像的方法主要有三種:基于已有鏡像的容器建立、基于本地模闆導入、基于Dockerfile建立。

基于已有容器建立

例如,啟動一個鏡像,并在其中進行修改操作。例如,建立一個test檔案,之後退出,代碼如下:

[root@womr-c ~]# docker run -it ubuntu:18.04 /bin/bash
root@d6b569374955:/# to 
toe    top    touch  
root@d6b569374955:/# touch test
root@d6b569374955:/# exit
[root@womr-c ~]# docker commit -m 'add a new file' -a 'worm-c' d6 test:0.1
sha256:e631dedb401061613cf759f80b6b62d83576f4c8b21511c5c3b5b24c7948e107
[root@womr-c ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
test         0.1       e631dedb4010   3 seconds ago   63.3MB
ubuntu       18.04     2c047404e52d   2 months ago    63.3MB
nginx        1.14.2    295c7be07902   22 months ago   109MB           

檔案模闆導入

例如,要直接導入一個鏡像,可以使用OpenVZ提供的模闆來建立,或者用其他已導出的鏡像模闆來建立。OPENVZ模闆的下載下傳位址為

http://openvz.org/Download/templates/precreated
[root@womr-c ~]# cat centos-7-x86_64-minimal-20170709.tar.xz |docker import - centos:7.0
sha256:1a1cbfa97aa871e243a92dc8fcc16d8df1f421e1443c210416698bb44fb3bd33
[root@womr-c ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       7.0       1a1cbfa97aa8   4 seconds ago   387MB
test         0.1       e631dedb4010   7 minutes ago   63.3MB
ubuntu       18.04     2c047404e52d   2 months ago    63.3MB
nginx        1.14.2    295c7be07902   22 months ago   109MB           

Dockerfile建立

建立Dockerfile

FROM debian:stretch-slim
LABEL version="1.0" maintainer="docker user <docker_user@github>"
RUN apt-get update && \
    apt-get install -y python3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*           

執行如下指令

docker build -t pthon:3 .
Removing intermediate container 955940f9c9aa
 ---> 5db817c293e5
Successfully built 5db817c293e5
Successfully tagged python3:latest           

導出和導入鏡像

導出鏡像

例如導出nginx1.14.2鏡像為檔案nginx.tar

docker save -o nginx.tar nginx:1.14.2           

導入鏡像

例如将nginx.tar導入鏡像

[root@womr-c ~]# docker load -i nginx.tar 
#也可 docker load <  nginx.tar
Loaded image: nginx:1.14.2           

docker操作容器

建立容器

可以使用docker create指令建立一個容器,例如:

[root@womr-c ~]# docker create -it nginx:1.14.2 
b9ff064ef24be4a6a2651b888b090e08a6c0866e54597e8d9fd3fe5087d13355
[root@womr-c ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS    PORTS     NAMES
b9ff064ef24b   nginx:1.14.2   "nginx -g 'daemon of…"   20 seconds ago   Created             exciting_ramanujan
[root@womr-c ~]# docker restart b9
b9           

守護程序

更多的時候,需要讓Docker容器在背景以守護态(Daemonized)形式運作。此時,可以通過添加-d參數來實作

[root@womr-c ~]# docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo helloworld;sleep 1;done"
6011437625d867a83d8ccd062f09fccb2b53ed8ad33e12b0716dd0a04edb8742
[root@womr-c ~]# docker logs -f 60
helloworld
helloworld
helloworld
helloworld
helloworld
helloworld
helloworld
helloworld
helloworld
helloworld
^C           

停止容器

如下:

[root@womr-c ~]# docker stop 60
60           

進入容器

[root@womr-c ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
b9ff064ef24b   nginx:1.14.2   "nginx -g 'daemon of…"   8 minutes ago   Up 8 minutes   80/tcp    exciting_ramanujan
[root@womr-c ~]# docker exec -it b9 /bin/bash
root@b9ff064ef24b:/# curl           

docker資料持久化

  • 資料卷(Data Volumes):容器内資料直接映射到本地主機環境;
  • 資料卷容器(Data Volume Containers):使用特定容器維護資料卷。

資料卷(Data Volumes)是一個可供容器使用的特殊目錄,它将主機作業系統目錄直接映射進容器,類似于Linux中的mount行為。

建立資料卷

[root@womr-c ~]# docker volume create -d local test
test
[root@womr-c ~]# cd /var/lib/docker/volumes           

除了create子指令外,docker volume還支援inspect(檢視詳細資訊)、ls(列出已有資料卷)、prune(清理無用資料卷)、rm(删除資料卷)等,例如:

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes           

綁定資料卷

[root@womr-c www]# docker run --rm -d -p 8081:80 --name nginx-test-web \
  -v /home/nginx/www:/usr/share/nginx/html \
  nginx:1.14.2
[root@womr-c www]# docker restart nginx-test-web
[root@womr-c www]# curl localhost:8081
<h1>hello nginx</h1>            

資料卷容器

如果使用者需要在多個容器之間共享一些持續更新的資料,最簡單的方式是使用資料卷容器。資料卷容器也是一個容器,但是它的目的是專門提供資料卷給其他容器挂載。

首先,建立一個資料卷容器dbdata,并在其中建立一個資料卷挂載到/dbdata:

docker run -it -v /dbdata --name dbdata ubuntu:18.04
243  docker restart  dbdata
244  docker run -it --volumes-from dbdata --name db1 ubuntu:18.04
245  docker run -it --volumes-from dbdata --name db2 ubuntu:18.04           

容器端口映射

端口映射實作容器通路

當容器中運作一些網絡應用,要讓外部通路這些應用時,可以通過-P或-p參數來指定端口映射。當使用-P(大寫的)标記時,Docker會随機映射一個49000~49900的端口到内部容器開放的網絡端口,例如:

docker run -d -P nginx:1.14.2           

映射本地接口位址到容器接口

docker run --rm -d -p 8081:80 --name nginx-test-web           

映射到指定位址的任意接口

使用IP::ContainerPort綁定localhost的任意端口到容器的80端口,本地主機會自動配置設定一個端口

docker run -d -p ::80 nginx:1.14.2            

檢視映射端口配置

[root@womr-c ~]# docker port eager_lalande
80/tcp -> 0.0.0.0:49155           

Dockerfile建立鏡像

Dockerfile由一行行指令語句組成,并且支援以#開頭的注釋行。一般而言,Dockerfile主體内容分為四部分:基礎鏡像資訊、維護者資訊、鏡像操作指令和容器啟動時執行指令。

例如寫入一個go web程式,如下:

package main
import "net/http"
func main() {
   http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
       writer.Write([]byte("hello"))
   })
   http.ListenAndServe(":9999",nil)
}           

Dcokerfile如下資訊:

FROM golang
MAINTAINER worm-c
WORKDIR $GOPATH/src/godocker
COPY . $GOPATH/src/godocker
RUN go build main.go
EXPOSE 9999
ENTRYPOINT ["./main"]           

生成docker鏡像,如下:

docker build -t worm/godemo:v1 .
docker run -it -d -p 80:9999 worm/godemo:v1 /bin/bash
curl localhost:80
//out hello           

容器編排工具DockerCompose

安裝

下載下傳位址

檔案權限:

sudo chmod a+x /usr/local/bin/docker-compose           

驗證是否成功:

docker-compose version
[root@worm-c ~]# docker-compose version
docker-compose version 1.28.2, build 67630359
docker-py version: 4.4.1
CPython version: 3.7.9
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019           

運作一個簡單的mysql應用,建立一個檔案mysql-service.yaml,如下:

version: '3'
services:
  mysql-db:
    container_name: mysql-docker        # 指定容器的名稱
    image: mysql:5.7                 # 指定鏡像和版本
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_ROOT_HOST: ${MYSQL_ROOT_HOST}
    volumes:
      - "${MYSQL_DIR}/data:/var/lib/mysql"           # 挂載資料目錄
      - "${MYSQL_DIR}/config:/etc/mysql/conf.d"      # 挂載配置檔案目           

**