Docker 學習筆記

# 常用的幾個docker命令
# 創建docker-machine命令,並且掛載相應目錄和修改鏡像源爲國內的鏡像源
docker-machine create \
--engine-registry-mirror http://hub-mirror.c.163.com \
--virtualbox-share-folder "D:\WorkSpace:/d/WorkSpace" \
default
# 根據鏡像創建一個容器
docker run -itd ubuntu/ubuntu
# 根據鏡像創建一個容器並掛載目錄(掛載目錄的話只能在 win cmd 下運行)
# 在 cmd 命令下創建容器
winpty cmd
# 創建並且掛載目錄,掛載目錄的命令只能在 win cmd 下正常使用,在git bash中會報錯
docker run -itd -v /d/WorkSpace:/home/work node
# 打開一個bash並且附在終端上
docker exec -it ubuntu-test bash
# 後臺啓動一個容器
docker start ubuntu-test
# 構建docker鏡像!
# docker build -t(tag) [構建者名稱/鏡像名稱:版本名稱]|[鏡像名稱:版本名稱] 指定dockerfile 指定構建目錄
docker build -t ddl-python:xgb -f /root/onlinemodels-python/Dockerfile /root/onlinemodels-python/

docker build -t python:xgb .
# 查看所有的容器(包括正在運行當中的和已經停止了的)
docker ps -a -q
# 停止所有容器
docker stop $(docker ps -a -q)
# 根據鏡像創建並運行一個容器 並且執行命令
docker run -d -p 28080:8080 python:xgb
# 解壓對應的zip包
unzip onlinemodels-python.zip 
# 運行jar包
nohup java -jar scoring.jar > out.file 2>&1 &
demo走一遍

# 從一個容器中拷貝文件到本地
docker cp 92b8d7d51979:/conf/pseudo-distributed.ini ./pseudo-distributed.ini

# 使用加速鏡像進行下載
./docker pull teradatalabs/cdh5-hive --registry-mirror=https://f8up***.mirror.aliyuncs.com 

//通過鏡像來運行容器並指定別名並且將容器中的端口隨機映射到外部(運行命令)
docker run -d --name hadoop-master -P -h hadoopp-master teradatalabs/cdh5-hive

# 設置容器的環境變量並啓動
docker run -d -P -e DEPLOY_ENV="dev" d5729c256c0b

docker exec -it 92b8d7d51979 bash	//進入一臺容器的命令行界面

winpty docker exec -it 92b8d7d51979 bash //在mingw中登入一臺虛擬機並且運行命令

docker-machine.exe ssh default //登入一臺虛擬機並且運行命令

# 查看當前 docker 信息(包括加速鏡像信息)
docker info

# 避免 git bash 使用windows命令亂碼的方法,在命令前面加上 winpty
# 如直接使用 ping www.baidu.com 的話有些字符由於字符集不同導致亂碼
# 但如果使用 winpty ping www.baidu.com 的話就會正常顯示了

# 操作 容器的命令
docker container 
# 查看容器當前的運行狀態
docker container stats
# 查看當前容器的詳細信息
docker container inspect 
# 操作鏡像的命令
docker image 3e5373a7ba55
# 檢查 docker 鏡像的的信息
docker image inspect ajoifaewf9w0
# 運行jar包
nohup java -jar -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+DisableExplicitGC -XX:+UseCompressedOops -XX:+DoEscapeAnalysis -XX:MaxTenuringThreshold=10 -verbose:gc -Xloggc:/scoring/logs/gc.log -XX:+PrintGCDetails scoring.jar > out.file 2>&1 &
# 構建docker鏡像!
# docker build -t(tag) [構建者名稱/鏡像名稱:版本名稱]|[鏡像名稱:版本名稱] 指定dockerfile 指定構建目錄
docker build -t python:xgb -f /root/onlinemodels-python/Dockerfile /root/onlinemodels-python/

docker build -t python:xgb .
# 查看所有的容器(包括正在運行當中的和已經停止了的)
docker ps -a -q
# 停止所有容器
docker stop $(docker ps -a -q)
# 運行一個鏡像 並且執行命令
docker run -d -p 28080:8080 python:xgb
# 解壓對應的zip包
unzip onlinemodels-python.zip 
# 運行jar包
nohup java -jar -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+DisableExplicitGC -XX:+UseCompressedOops -XX:+DoEscapeAnalysis -XX:MaxTenuringThreshold=10 -verbose:gc -Xloggc:/alidata1/admin/scoring/logs/gc.log -XX:+PrintGCDetails scoring.jar > out.file 2>&1 &
demo走一遍

docker cp 92b8d7d51979:/conf/pseudo-distributed.ini ./pseudo-distributed.ini	//從一個容器中拷貝文件到本地

./docker pull teradatalabs/cdh5-hive --registry-mirror=https://f8upif7d.mirror.aliyuncs.com //使用加速鏡像進行下載

//通過鏡像來運行容器並指定別名並且將容器中的端口隨機映射到外部(運行命令)
docker run -d --name hadoop-master -P -h hadoopp-master teradatalabs/cdh5-hive

docker exec -it 92b8d7d51979 bash	//進入一臺容器的命令行界面

winpty docker exec -it 92b8d7d51979 bash //在mingw中登入一臺虛擬機並且運行命令

docker-machine.exe ssh default //登入一臺虛擬機並且運行命令
# 啓動當前已經退出的容器並且進終端
winpty docker start -it 92b8d7d51979 

關於 Docker 的密碼設置問題

通常情況下,推薦使用 docker-machine ssh default 進行登錄,不需要輸入密碼。default 是默認的 machine 的名字。
在 boot2docker 中,默認的用戶名和密碼是:

user: docker
pass: tcuser

登錄方法:

$ ssh docker@localhost -p 2022
docker@localhost's password: tcuser
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/

docker port 命令可以讓我們快捷地查看端口的綁定情況.

docker port adoring_stonebraker 5000

docker port docker查看端口綁定命令
adoring_stonebraker 容器名字
5000 要查詢的容器內的端口
返回結果

# 容器端口映射到對應主機端口的信息
127.0.0.1:5001

默認使用pull直接從網上拉取鏡像的話會從官網上拉取鏡像,由於鏡像源在國外,導致拉取鏡像的速度比較慢,這時可以使用下面的配置指定鏡像源:

./docker pull teradatalabs/cdh5-hive --registry-mirror=https://f8up****.mirror.aliyuncs.com //使用加速鏡像進行下載
docker run --name mysql -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

-p將主機端口映射到容器端口
12345主機端口
3306容器端口
-e MYSQL_ROOT_PASSWORD=123456設置環境變量
-d以守護進程的方式運行

關閉 docker-machine

# 創建 Docker
# 關閉default docker 虛擬機
docker-machine stop default
# 重啓 docker-machine 虛擬機
docker-machine restart default
# 啓動ssh打開docker-machine虛擬機終端
docker-amchine ssh default
# 刪除 docker-machine 虛擬機
docker-machine rm default

Docker pull 報錯 error during connect
錯誤原因猜測:可能和環境變量有關係

解決方案:
# 在 cmd 命令下執行,重新部署和docker相關的環境變量
@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

Docker 拉取私服鏡像源失敗解決方法:

[Error] server gave HTTP response to HTTPS client

Docker 私有倉庫,pull鏡像報錯

Insecure registry setup not clear for Docker Machine

如何修改Windows上Docker的鏡像源

Docker ToolBox解決 http: server gave HTTP response to HTTPS client問題

Unable to query docker version

error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.28/version: open //./pipe/docker_


設置私有的鏡像源(不能用):

docker-machine create --engine-registry-mirror=192.168.291.133:5000 default

這裏不能使用的原因是該地址不是一個合法的鏡像倉庫導致的,在設置加速鏡像的時候一定要確保加速鏡像是可用的,否則docker並不會在創建 docker-machine過程中爆出錯誤,而是在docker pull 命令拉取鏡像的時候爆出一堆問題.

# 阿里的鏡像加速器
docker-machine create --engine-registry-mirror=https://f8u****.mirror.aliyuncs.com -d virtualbox default
# docker 重新生成證書
docker-machine regenerate-certs

Docker 中國官方鏡像加速

# 我遇到這個問題的原因是我設置了錯誤的加速鏡像倉庫導致的
# 這個地方就比較坑,這裏不論你設置了什麼加速鏡像,docker都會爲你創建一個 docker-machine 但是不會報錯,只有 docker-machine 創建好了以後纔會報一個證書錯誤的問題.
docker-machine create --engine-registry-mirror=https://dfasd.mirror.aliyuncs.com -d virtualbox default
Error creating machine: Error running provisioning: Unable to verify the Docker daemon is listening: Maximum number of retries (10) exceeded

一個錯誤的 docker-machine 虛擬機會給你帶來多大的麻煩是你這個入門級選手想像不到的.不要隨便設置加速鏡像,哪怕你的初衷是能夠實現快速的下載,但最終的結果會發現事與願違.它只會給你帶來一堆你解決不了的問題.

如何正確的使用 Docker Toolbox

  1. 下載並且安裝 Docker Toolbox.
    可以使用 docker quick start 終端命令行快速啓動默認的docker-machine default,但事實上發現,這樣並不是最快的啓動方法.相反,docker在最初啓動的時候會去國外的github網站上下載一個名爲 bootdocker 的鏡像,再幾次嘗試手動下載這個鏡像以加快啓動速度後放棄了這個想法.剛開始學習的時候最好別嘗試手動下載這個鏡像了,網上其他地方提供的鏡像會有過時的問題,而docker發現鏡像過時後會拒絕使用該鏡像並且會轉到源鏡像地址下載
  2. 使用 docker-machine create default 創建一個默認的 docker 虛擬機
  3. 使用提供的私有倉庫地址下載鏡像如
    docker pull 192.253.6.120:5000/env/jdk8

這個過程中間可能會報一個錯誤:

error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.28/version: open //./pipe/docker_

這是由於系統的環境變量和docker-machine虛擬機內部部分環境變量不一致導致的問題.修復方法如下,在cmd命令行下執行:

解決方案:
# 在 cmd 命令下執行,重新部署和docker相關的環境變量
@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

Docker ToolBox解決 http: server gave HTTP response to HTTPS client問題

server gave HTTP response to HTTPS client 問題

這是由於返回的是 http 響應而docker 默認使用的是 https 客戶端導致的.默認使用 https 客戶端進行請求而不是 http請求是docker做的一個連接安全的措施.這裏由於需要請求不安全的鏡像倉庫,所以需要單獨的將通過http請求訪問的鏡像地址單獨加一下白名單.

docker-machine ssh default
cd /var/lib/boot2docker
vi profile
EXTRA_ARGS='
--label provider=virtualbox
--insecure-registry 192.168.192.161:50002

'
CACERT=/var/lib/boot2docker/ca.pem
DOCKER_HOST='-H tcp://0.0.0.0:2376'
DOCKER_STORAGE=aufs
DOCKER_TLS=auto
SERVERKEY=/var/lib/boot2docker/server-key.pem
SERVERCERT=/var/lib/boot2docker/server.pem

在 profile 中EXTRA_ARGS標籤的子標籤label provider後面添加 insecure-registry 將請求的url 地址加入到白名單中,這樣就可以正常下載了.

# 搜索當前都有哪些鏡像
λ docker search jdk
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
jboss/base-jdk 65 [OK]
fabric8/java-jboss-openjdk8-jdk Fabric8 Java Base Image (JBoss, OpenJDK 8) 26 [OK]
codetroopers/jenkins-slave-jdk8-android 25 [OK]
fabric8/java-alpine-openjdk8-jdk Fabric8 Java Base Image (Alpine, OpenJDK 8, … 17 [OK]

啓動 Docker 容器的終端

# 相當於在容器中執行了bash 命令並且將當前命令行的輸入和輸出附到當前命令行上
docker exec -it 143rqeqwer /bin/bash
# 使用 docker attach 將容器的輸入輸出附到當前終端上
docker attach

使用Docker Toolbox 學習docker

在 Windows 上使用 Docker Toolbox 學習 Docker 真的好難啊,因爲架構不同.遇到了好多坑.
基本架構:

虛擬機
輸入
ssh 通訊
Windows系統
VirtualBox 虛擬機
docker-machine
docker 命令
鏡像1
容器1
容器2
容器...
鏡像2
鏡像...

主體的架構大概是這樣:

主機
宿主機:VirtualBox:docker-machine
docker

我們在調用 Windows 上面的 docker 命令時,實際上是在調用宿主機(VirtualBox)上的 docker 命令.從而導致了有些地方和我想象的不一致.
比如修改默認的鏡像加速源,在Linux系統上修改鏡像加速源的方式一般是修改一個配置文件即可,但是在 Windows 系統上無法使用.只能在創建Docker宿主機的時候指定鏡像源(當然在創建以後進入到宿主機內部修改配置文件也可以,但是比較麻煩.):

# --engine-registry-mirror 指定了對應的鏡像加速源
docker-machine create \
--engine-registry-mirror=https://f8u****.mirror.aliyuncs.com \
-d virtualbox default

# 通過 docker-machine inspect default 查看創建的宿主機的信息
docker-machine inspect default

另外一個比較坑的地方就是在需要向容器內掛載相應的主機目錄時,需要首先將響應的目錄掛載到宿主機docker-machine當中,然後才能掛載到容器當中

# 在創建宿主機 docker-machine 的時候掛載主機中的目錄
docker-machine create \
--engine-registry-mirror http://hub-mirror.c.163.com \
--virtualbox-share-folder "D:\WorkSpace:/d/WorkSpace" \
default
# 在創建並運行容器的時候掛載宿主機的目錄
docker run -i -v "/d/WorkSpace:/home/spacevim/work" \
spacevim/spacevim
# 或者以下命令
winpty docker run -it \
-v /home/docker/work:/home/spacevim/work \
spacevim/spacevim /bin/bash

需要注意的是,當主機的目錄沒有被掛載到宿主機 docker-machine 上,而在創建容器的時候想要掛載宿主機的相應的目錄時,只會在宿主機上面創建一個空的目錄.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章