Docker學習筆記 - 第四篇:映象倉庫

m53469發表於2021-09-09

最近疫情鬧的,在家溫習之前在私塾線上買的cc老師的課程Docker,為了加深印象及鞭策一下自己換高薪工作,堅持做系列筆記,記錄自己成長的點點滴滴。不過看到訊息cc老師最新一期的高階架構師課程也要推出了,裡面包含了現在主流的架構,以及最新的技術,據說從理論到運用全部帶著做,像現在面試常用的 Netty, Redis, Kafka,Zookeeper, Dubbo, Nginx + openResty + kong + Lua, ElasticSearch等技術都深入原始碼層級

1 Docker倉庫

1.1 簡介

官方Docker Hub地址:

1.2 搭建私有倉庫

1:下載映象:docker pull registry

2:啟動Docker Registry容器

   docker run -d -p 5000:5000 -v /ccuse/myregistry/:/tmp/registry --privileged=true registry

3:檢視Docker Registry程式:docker ps

1.3 私有倉庫基本操作

1:檢視Registry倉庫中現有的映象

   curl -XGET http://192.168.1.111:5000/v2/_catalog

2:將Docker映象推到Registry中

  • 給本地映象打Tag

       docker tag cctomcat9 192.168.1.111:5000/cctomcat9test
    
  • 推送映象到Registry中

     docker push 192.168.1.111:5000/cctomcat9test
    

    會出現錯誤,因為client與Registry互動預設將採用https訪問,但我們在安裝Registry時並未配置指定相關的key和crt檔案,https將無法訪問

  • 在/etc/sysconfig/docker中做配置:

     ADD_REGISTRY='--add-registry 192.168.1.111:5000’
    
     INSECURE_REGISTRY=‘--insecure-registry 192.168.1.111:5000’
    
     然後重啟docker服務:
    
     service docker restart
    
     然後重新推送映象到倉庫中。
    

1.4 配置Docker Registry管理介面

Docker官方只提供了REST API,並沒有給我們一個介面。 可以下載映象“hyper/docker-registry-web”來進行映象的管理。
具體的執行和使用,請參見官方文件:
預設的只是瀏覽倉庫中的映象,如果要刪除的話:

  • 要建立一個給registry用的config.yml,在裡面設定可以delete,形如:
version: 0.1
log:
  level: info
  formatter: text
  fields:
    service: registry-srv
    environment: production
storage:
  cache:
    layerinfo: inmemory
  filesystem:
    rootdirectory: /tmp/registry
  delete:
    # 要在 ui 上能夠刪除映象,enable 的值必須是 true
    enabled: true
http:
  addr: :5000
  • 建立一個給registry-web用的config.yml,這個官方網站上有

  • 重新啟動registry,如:

    docker run -d -p 5000:5000 --name registry-srv -v /ccuse/myregistry/registryconf/:/etc/docker/registry:ro -v /ccuse/myregistry/:/tmp/registry --privileged=true registry  
    
  • 重新啟動registry-web,形如:

     docker run -it -d -p 8080:8080 --name registry-web --link registry-srv -v /ccuse/myregistry/forwebconf/config.yml:/conf/config.yml --privileged=true hyper/docker-registry-web  
    

2 使用MySql映象

docker pull mysql
docker run --name mysql -p 12345:3306 -v /ccuse/programes/mysqldata:/var/lib/mysql --privileged=true  -e MYSQL_ROOT_PASSWORD=cc -d mysql

這裡指定了使用自己的mysql資料檔案

  • 使用自定義配置檔案,在mysqlconf下放著my.cnf檔案:

    docker run --name mysql -p 12345:3306 -v /ccuse/programes/mysqldata:/var/lib/mysql -v /ccuse/programes/mysqlconf:/etc/mysql/conf.d --privileged=true -e MYSQL_ROOT_PASSWORD=cc -d mysql

  • 使用自定義日誌目錄

     -v /ccuse/programes/mysqllogs:/var/log/mysql 
    

如果日誌開啟不成功,可能是因為 mysql使用者沒有對日誌資料夾的操作許可權,進入到容器裡面,設定一下,示例如下:

chown -R mysql:mysql /var/log/mysql
  • 資料表備份

     docker exec 容器id sh -c 'exec mysqldump --all-databases -uroot -p"cc"' > /ccuse/all-databases.sql
    

3 使用Redis映象

docker pull redis
docker run --name myredis -d redis,預設暴露6379埠
  • 如果想使用自己的配置檔案啟動redis,一種方法是在其基礎上寫一個dockerfile,例如:
 FROM redis
 COPY redis.conf /usr/local/etc/redis/redis.conf
 CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

另外一種方式是在啟動命令中修改配置,如:

docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf  

4:資料預設儲存在VOLUME /data目錄下,使用-v來指定掛載,如:

 docker run --name myreis -d -p 6379:6379 -v /redisdocker/data:/data -v /redisconf/redis.conf:/usr/local/etc/redis/redis.conf --privileged=true  redis redis-server /usr/local/etc/redis/redis.conf  

注意:自己寫的conf檔案裡面,不要配置bind的ip,也不要daemonize的配置,直接註釋掉

5:如果需要開啟aof的持久化方式,預設是rdb的,可以在配置檔案裡面設定,也可透過命令列指定:

docker run --name some-redis -d redis redis-server --appendonly yes

6:如果應用需要連線redis:

docker run --name some-app --link some-redis:redis -d application-that-uses-redis

4 容器連線

4.1 簡介

前面學習到的埠對映,並不是唯一把docker連線到另一個容器的方法。docker有一個連線系統允許將多個容器連線在一起,共享連線資訊。docker連線會建立一個父子關係,其中父容器可以看到子容器的資訊。
有時出於安全原因,可以強制docker只允許有連線的容器之間互相通訊,可以在啟動docker守護程式的時候,加上–icc=false,關閉沒有連線的容器間通訊。
在docker run的時候, 指定–link :標誌建立了兩個容器間的父子連線,這樣容器就不用暴露埠了,大大增加安全性。

4.2 基本使用

基本語法:–link 要連線的容器的名字:這個連線的別名

  • 執行連線需要依靠容器的名字,因此建立每一個容器的時候,請使用–name來命名。

     注意:容器的名稱必須是唯一的。如果想使用重複的名稱來命名容器,需要使用docker rm命令刪除以前的容器。
    
  • 被連線的容器必須執行在同一個Docker宿主機上

  • 示例:

    docker run --name db -e MYSQL_ROOT_PASSWORD=cc -d mysql
    docker run -d -p 9080:8080 --name web --link db:dblink cctomcat:9.0

  • 可以透過docker inspect檢視裡面的Links,如: “/db:/web/dblink”

圖片描述

4.3 啟動常見錯誤解決方案

如果啟動的時候,出現類似如下的錯誤:

COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -A DOCKER -p tcp -d 0/0 --dport 9080 -j DNAT --to-destination 172.17.0.4:8080 ! -i docker0' failed:

這可能是網路問題造成,解決方法如下:

  • 首先先驗證docker容器內部網路是否能ping通宿主機

     如果能ping通,即可透過重建docker0網路恢復
    
  • 先停掉宿主機上執行的docker容器,然後執行以下命令

    iptables -t nat -F
    ifconfig docker0 down
    brctl delbr docker0

  • 重啟docker服務

如何使用容器連線來通訊
最簡單的方法就是在子容器裡面,也就是web裡面,直接使用link的別名來代替具體的host或者是ip地址,比如:

 jdbc:mysql://dblink:3306/mydb

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2819/viewspace-2825661/,如需轉載,請註明出處,否則將追究法律責任。

相關文章