docker部署redis實戰

  • 2019 年 12 月 12 日
  • 筆記

換電腦的時候不想再搭建開發環境了!——編程三分鐘

什麼是docker

Docker是一個用來管理容器的應用程序,而容器就是模擬運行應用程序所依賴環境的一個服務。一般一個容器內只安裝一個程序,在容器內的應用程序會認為自己是機器上運行的唯一進程,一台機器可以獨立運行多個容器。

使用容器的好處就是不用再繁瑣的配置運行環境,便於構建、測試、持續集成;可以動態擴容和縮容、充分利用一台服務器跑多個服務,因此在本機就可以模擬出微服務架構。

當然,我個人覺得最爽的一點還是可以在容器里隨意的開發測試,但也不用擔心把自己心愛的電腦搞的亂七八糟了。

準備

  • 一台安裝docker的機器
  • 能通網並訪問最新版本的Docker Engine (服務端)
  • 本地開發機器安裝了Docker Client(Docker 命令行工具),可通過命令行訪問。

運行容器

可以在 官網上 搜索到現成的鏡像,也可以用以下方式查找容器,命令格式:

docker search <name>

實際執行

$ docker search redis  NAME               DESCRIPTION                                             STARS OFFICIAL AUTOMATED  redis              Redis is an open source key-value store that… 7023            [OK]  bitnami/redis      Bitnami Redis Docker Image 114                                          [OK]  省略……

我們找到了redis的OFFICIAL(官方)docker 鏡像名就是redis,為了讓它能提供服務,我們接下來的任務就是讓他作為後台服務運行,命令格式:

$ docker run <options> <image-name>

默認情況下,Docker將在前台運行命令。要在後台運行,需要指定選項-d。

$ docker run -d redis  570315fb8a0596ff5581653a77f8ef406f86a0ab4b1a2061de7a423335812ed3

默認情況下,Docker將運行最新版本。如果需要特定版本,則需要將其顯式的指定出來。 例如,版本3.2

$ docker run -d redis:3.2

由於這是我們第一次使用Redis鏡像,所以它將被下載到Docker主機上,如果本地存在就不會了。

查看運行中的容器

可以用docker ps命令列出所有正在運行的容器,包括用於啟動容器的鏡像和正常運行的時間等信息。

$ docker ps  CONTAINER ID IMAGE   COMMAND                 CREATED       STATUS PORTS NAMES  570315fb8a05 redis   "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 6379/tcp elastic_mclean

列出正在運行的容器的更多詳細信息,例如IP地址,命令格式如下:

docker inspect <friendly-name|container-id>

通過docker logs命令可以查看容器的日誌,命令格式如下:

docker logs <friendly-name|container-id>

訪問redis

我們現在用容器部署成功了一個redis,但是和直接安裝一個redis不一樣,容器就像一台虛擬機一樣,想要訪問服務,要不就進入到裏面,要不就通過暴露端口像遠程訪問一樣來進行訪問。

-p <host-port>:<container-port>選項可以在啟動容器的時候綁定端口。

這個時候使用-name <name>來在啟動容器的時候定義一個名稱,以後查詢以及查看日誌都會比較方便。

因為redis默認佔用6379端口,我們可以將端口6379映射到本地的6379

$ docker run -d  --name redisHostPort -p 6379:6379 redis:latest  694384d739307f3c5bc59fa

tips:默認情況下,主機上的端口映射到0.0.0.0,可以在定義端口映射的時候指定特定的IP,例如-p 127.0.0.1:6379:6379

假設我們要部署多個redis不可能每次都自己親手來找一個端口來映射,docker是支持自動綁定到可用端口上的,只要用-p 6379這個參數就可以了,像下面這樣。

$ docker run -d --name redisDynamic -p 6379 redis:latest  dcd3dabe51c3f0a8ddbdfd

到底綁定了哪個端口,可以用以下命令查詢(這個時候就用到自定義的名稱redisDynamic了),當然直接用docker ps也是可以的。

$ docker port redisDynamic 6379  0.0.0.0:32768

存儲數據

在使用容器的時候我們會發現,一旦創建和刪除、升級容器,裏面存儲的數據也就隨風而去了,所以我們必須想辦法把數據存儲下來。

我們查詢到官網上的redis鏡像存儲數據的目錄在/data目錄,然後我們存儲在本地/opt/docker/data/redis 使用參數-v 本機位置:容器內位置

docker run -d --name redisMapped -v /opt/docker/data/redis:/data redis  c9c154695500260407d99d

當然了,也可以把配置文件重定向到本地,可以把所有的容器配置、日誌、數據統一管理,非常的方便。

與平台交互

docker run ubuntu ps 啟動Ubuntu容器並執行命令ps以查看容器中運行的所有進程。 docker run -it ubuntu bash直接訪問容器內的bash shell。

$ docker run ubuntu ps    PID TTY TIME CMD      1 ?  00:00:00 ps  $ docker run -it ubuntu bash  root@6db973337059:/# exit

訪問正在運行的docker docker attach <container> 要attach上去的容器必須正在運行。 docker exec -it <container> bash|sh直接訪問容器內的bash shell。

$ docker attach c9c154695500 /bin/bash  root@c9c154695500:/data# exit  $ docker exec -it c9c154695500 /bin/bash  root@c9c154695500:/data# exit

這裡也可以直接用容器name

  • attach 直接進入容器,不會啟動新進程
  • exec 在容器中打開新終端,會啟動新進程

那什麼時候用attach,什麼時候用exec呢?