新手Docker入門


what's the Docker

  Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。

  Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。

  容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。

 

Docker的應用場景

  • Web 應用的自動化打包和發布。

  • 自動化測試和持續集成、發布。

  • 在服務型環境中部署和調整數據庫或其他的后台應用。

  • 從頭編譯或者擴展現有的OpenShift或Cloud Foundry平台來搭建自己的PaaS環境。

 

Docker 安裝及使用

安裝 Docker

  • Ubuntu 安裝 Docker
    sudo apt-get install docker.io # 安裝docker
  • CentOS 安裝 Docker
    # 安裝之前,建議先yum -y upgrade更新軟件包
    # 安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 設置yum源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    '''
    已加載插件:fastestmirror, langpacks
    adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
    grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
    repo saved to /etc/yum.repos.d/docker-ce.repo
    '''
    
    # 查看所有倉庫中所有docker版本,並選擇特定版本安裝
    yum list docker-ce --showduplicates | sort -r
    
    # 安裝Docker
    yum install docker-ce-版本號  # 如docker-ce-17.12.1.ce
  • Windows 安裝 Docker:參考官方文檔 https://docs.docker.com/toolbox/toolbox_install_windows/
    • 注:在Windows10上安裝 Docker 是一件很坑的事,win10 企業版和專業版可以直接安裝 Docker for Windows,但是 win10 家庭版需要安裝 Docker Toolbox,Docker Toolbox 的原理是創建一台安裝有 Docker 環境的 Linux 虛擬機,指定機器名稱為 default。安裝完成后會在桌面得到3個客戶端,分別是 Oracle VM VirtualBox、Kitematic (Alpha) 和 Docker Quickstart Terminal,Oracle VM VirtualBox 用於查看虛擬機,Docker Quickstart Terminal 是一個終端工具用於啟動 Docker。如果一切順利的話,安裝完成后雙擊 Docker Quickstart Terminal,你的 Docker 服務就起來了,但是!!!雙擊后你大概率會遇到卡在 waiting for an IP... 的位置,然后報錯,處理方式自行 GOOGLE 吧,祝你好運。
    • 后記:在網上找到一個看過去比較靠譜的 Windows 安裝 Docker 的文章,不過沒有親測,感興趣的可以自己試試:https://www.biaodianfu.com/windows-install-docker.html
  • MacOS 安裝 Docker
    brew cask install docker

 

重啟 Docker

service docker restart  
'''
如果不重啟,docker pull時會有如下錯誤:
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon. Is the docker daemon running on this host?)...
'''

 

拉取 Ubuntu 或 CentOS鏡像

sudo docker pull daocloud.io/ubuntu # 拉取一個ubuntu鏡像到本地
sudo docker pull centos:7.2.1511    # 拉取一個CentOS 7.2鏡像到本地

 

列出鏡像

sudo docker images

 

記住上面兩個鏡像各自的 IMAGE ID,進入 Docker 時需要用到(刪除鏡像時同樣也需要用到)

刪除鏡像

docker rmi 鏡像ID

 

裝載鏡像到容器並運行進入容器系統

sudo docker run -it -p 2221:22 -p 8880:80 7698f282e524 /bin/bash # 運行ubuntu容器系統
exit # 退出Ubuntu容器
sudo docker run -it -p 2221:22 -p 8880:80 9aec5c5fe4ba /bin/bash # 運行centos容器系統
exit # 退出CenOS容器
--name # 指定容器名,"--name my_Ubuntu"指定容器名為"my_Ubuntu";
-p # 映射端口,"-p 80:80"表示映射容器80端口到主機80端口,參數格式ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
-P # 映射端口,將容器暴露的所有端口,都隨機映射到宿主機上(不推薦使用)
--net=host # 映射端口的另一種方式,容器的所有端口都映射到宿主機相應端口上
-d  # 在后台運行,並打印container id
-e LANG=en_US.UTF-8 # 指定支持中文
--memory # 限制容器的內存使用量(如10m,200m等)
--memory-swap # 限制內存和 Swap 的總和,不設置的話默認為--memory的兩倍
'''
如果只指定了 --memory 則 --memory-swap 默認為 --memory 的兩倍
如果 --memory-swap 和 --memory 設置了相同值,則表示不使用 Swap
如果 --memory-swap 設置為 -1 則表示不對容器使用的 Swap 進行限制
如果設置了 --memory-swap 參數,則必須設置 --memory 參數
后期 update --memory 時數值不能超過 --memory-swap 的值,否則會報錯 Memory limit should be smaller than already set memoryswap limit
'''
啟動 docker 時的幾個常用參數

 

列出全部裝載的容器,包括已停止的和正在運行的

sudo docker ps -a # -a 參數會列出停止的容器,不加-a只顯示正在運行的容器

 

后台啟動 / 關閉 Docker

sudo docker start 容器ID # 后台啟動容器
# sudo docker stop 容器ID # 關閉后台啟動的容器
sudo docker ps # 列出當前正在運行的容器

# 進入當前容器
sudo docker attach 容器ID # 此命令進入容器后,輸入 exit 退出容器時會關閉容器,推薦使用 exec
sudo docker exec -it 6d00698360eb  env LANG=C.UTF-8 /bin/bash #此命令進入容器后,輸入 exit 退出容器時不會關閉容器,容器依舊會在后台運行

# 進入 MySQL 容器命令
sudo docker exec -it 容器ID  env LANG=C.UTF-8 bash

# 進入 Redis 容器命令
sudo docker exec -it 容器ID  env LANG=C.UTF-8 redis-cli

 

Docker 支持中文

  如果在容器啟動時沒有指定語言的話,docker 默認是不支持中文的。使用 locale 命令可以看到默認都是"POSIX"

解決方法

# 編輯文件
nano /etc/profile

# 將下面變量加到最后一行,保存並推出
LANG=zh.CN.utf8

# 重新加載文件
source /etc/profile
# 方式一
export LANG=C.UTF-8 LC_ALL=C.UTF-8

# 上述若出現warning信息無法成功,試試方式二
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
針對docker環境運行Python腳本報錯'ascii' codec can't decode byte 0xe6 in position 854: ordinal not

 

Docker update

  有時候我們需要更改已經啟動的容器的某些配置,可以使用 docker update 命令

docker update --cpus "0.5"  容器ID # 限制指定容器的 CPU 占用最多為 0.5CPU
docker update --cpus "1.5" --cpuset-cpus 0  容器ID # 指定使用的 CPU 核(0 表示使用第一個核)
docker update --memory 20m 容器ID # 限制指定容器的最大使用內存(20m)

 

查看和統計容器所占用的資源情況

docker stats # 動態查看,每秒更新一次
docker stats --no-stream # --no-stream 參數表示只查看當前狀態,不動態顯示
docker top 容器ID # 默認顯示UID、PID、PPID、C、STIME、TTY、TIME、CMD
docker top 容器ID -o pid,stat,cmd # 使用 -o 參數可指定顯示信息

 

將一個容器打包成鏡像並在其他電腦中加載這個鏡像

  現在我有這么一個需求:我在另一台已經裝了 Docker 的電腦 B上開發了一個項目,項目在 Docker 的 Centos 容器里,我要把這個容器拎出來放到現在這台電腦 A 上,這樣我就不用安裝一大堆依賴,直接 run 就能運行項目了

  首先我在電腦B容器中 docker ps -a 看一下,有3個容器,開發的項目在第一個容器里,要將它打包成鏡像放到電腦 A 中使用

 

方式一:

  將容器導出成一個 tar 包,然后將這個 tar 包還原成一個新的鏡像

  • 打包命令
    sudo docker export vigorous_hypatia >   /home/zmh/下載/centos7_sipenv.tar
    # vigorous_hypatia 是要打包的容器的 NAMES,>后面跟的是打包后的文件存放的路徑
  • 然后我們就會得到一個centos7_sipenv.tar文件,把這個文件手動拷貝或者發送到電腦A,然后在電腦A中運行加載命令
    cat '/home/aitester/centos7_sipenv.tar'  | docker import  - xxx
    # cat 后面跟的是tar文件的路徑,import后面跟的是新容器的 NAME
  • 之后我們用 docker images 就能看到這個鏡像已經被加載了之后我們用 docker images 就能看到這個鏡像已經被加載了之后我們用 docker images 就能看到這個鏡像已經被加載了

 

 方式二

  將容器重新做成一個鏡像,將這個鏡像導出成一個 tar 包,然后將這個 tar 包還原成一個新的鏡像

  • 將容器變為鏡像
    docker commit  261314c94305  imagexxx
    '''
    可用參數
    -a :提交的鏡像作者;
    -c :使用Dockerfile指令來創建鏡像;
    -m :提交時的說明文字;
    -p :在commit時,將容器暫停。
    imagexxx是新創建的鏡像的名字
    '''
  • 將鏡像變為 tar 包
    docker save -o xxx.tar imagexxx # 當前路徑下會生成一個xxx.tar
  • 將 tar 包轉換成新的鏡像
    docker load --input xxx.tar

 

兩種方式的區別

  • 方式一的命令相對簡單
  • 方式二的優勢:可以將原容器中的相應設置一並保留。如:原容器中裝了 anaconda,項目指定了某 Python 環境,直接輸入命令 python xxx.py 就啟動了項目。如果使用方式二,在新容器中可以直接  python xxx.py 啟動項目;而在方式一的情況下,新容器需要先執行指定 Python 環境的命令,再 python xxx.py,否則就會找不到 Python。

推薦使用方式二

 

Docker手冊其他鏈接

  Docker 命令大全 

  Docker CentOS容器開啟 SSH 服務

  Docker 安裝 MySQL 並實現遠程連接

 

 

 

 

 

              

 

 

 

 

 

                 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM