導航:首頁 > 源碼編譯 > docker鏡像內無法完成編譯

docker鏡像內無法完成編譯

發布時間:2022-05-31 05:15:37

❶ windows 10 docker 自己編輯的本地鏡像 運行成功 但是pull不下來 ,也無法處於up狀態

windows上安裝的docker其實本質上還是藉助與windows平台的hyper-v技術來創建一個linux虛擬機,你執行的所有命令其實都是在這個虛擬機里執行的,所以所有pull到本地的image都會在虛擬機的Virtual hard disks目錄的文件中,這個文件就是虛擬硬碟文件。
如果要想改變路徑只需要在hyper-v管理器里設置就可以了。默認的安裝路徑是C:\Users\Public\Documents\Hyper-V\Virtual hard disks下。

❷ 如何到載百度網議

不久之前,機器之心聯合網路推出 PaddlePaddle 專欄,為想要學習這一平台的技術人員推薦相關教程與資源。在解析過PaddlePaddle框架之後,從這篇文章開始上手,安裝 PaddlePaddle。
目錄
環境
Windows 系統的安裝
在 Windows 上安裝 Docker 容器在 Windows 上安裝 Ubuntu
使用 pip 安裝
使用 Docker 安裝
源碼編譯生成安裝包
在本地編譯生成安裝包在 Docker 編譯生成安裝包
編譯 Docker 鏡像
測試安裝環境
最後提示
項目代碼
參考資料
環境
系統:Ubuntu 16.0.4(64 位)處理器:Intel(R) Celeron(R) CPU內存:8G
Windows 系統的安裝
PaddlePaddle 目前還不支持 Windows,如果讀者直接在 Windows 上安裝 PaddlePaddlePaddle 的話,就會提示沒有找到該安裝包。如果讀者一定要在 Windows 上工作的話,筆者提供兩個建議:一、在 Windows 系統上使用 Docker 容器,在 Docker 容器上安裝帶有 PaddlePaddle 的鏡像;二、在 Windows 系統上安裝虛擬機,再在虛擬機上安裝 Ubuntu。
在 Windows 上安裝 Docker 容器
首先下載 Docker 容器的工具包 DockerToolbox,筆者使用這個安裝包不僅僅只有 Docker,它還包含了 VirtualBox 虛擬機,使用者工具包我們就不用單獨去安裝 VirtualBox 虛擬機了,DockerToolbox 的官網下載地址:https://docs.docker.com/toolbox/toolbox_install_windows/
下載之後,就可以直接安裝了,雙擊安裝包,開始安裝

選擇安裝路徑,筆者使用默認的安裝路徑

然後安裝所依賴的軟體,因為筆者之前在電腦上已經安裝了 git,所以在這里就不安裝了,其他都要勾選

這一步不用修改什麼,讓程序為我們創建一個桌面快捷鍵

最後就可以安裝了,等待一小段時間即可

到這里就安裝完成了

安裝完成之後,如果直接啟動 Docker 的話,有可能可能會卡在這里,因為還有下載一個 boot2docker.iso 鏡像,網速比較慢的話就可能一直卡在這里。所以我們還要鏡像下一步操作

Running pre-create checks...
(default) No default Boot2Docker ISO found locally, downloading the latest release...
(default) Latest release for github.com/boot2docker/boot2docker is v17.12.1-ce
(default) Downloading C:\Users\15696\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v17.12.1-ce/boot2docker.iso...
在下載 DockerToolbox 的時候,這個工具就已經帶有 boot2docker.iso 鏡像了。並且存在 DockerToolbox 安裝的路徑上,筆者的路徑是:
C:\Program Files\Docker Toolbox\boot2docker.iso
我們把這個鏡像復制到用戶目錄\.docker\machine\cache\,如筆者的目錄如下:

C:\Users\15696\.docker\machine\cache\
復制完成之後,雙擊桌面快捷方式 Docker Quickstart Terminal,啟動 Docker,命令窗口會輸出以下信息:

Running pre-create checks...
Creating machine...
(default) Copying C:\Users\15696\.docker\machine\cache\boot2docker.iso to C:\Users\15696\.docker\machine\machines\default\boot2docker.iso...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting the VM...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to create a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Found a new host-only adapter: "VirtualBox Host-Only Ethernet Adapter #3"
(default) Windows might ask for the permission to configure a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.

(default) Waiting for an IP...
最後看到 Docker 的 logo 就表示成功安裝 Docker 容器了

## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com
Start interactive shell
15696@ MINGW64 ~
$
到這就可以使用 Docker 來安裝 PaddlePaddle 了,具體請看本文章中關於 Docker 使用 PaddlePaddle 部分
在 Windows 上安裝 Ubuntu
在 Windows 上在 Ubuntu 就要先安裝虛擬機,虛擬機有很多,筆者使用的是開源的 VirtualBox 虛擬機,VirtualBox 的官網:https://www.virtualbox.org/
安裝完成 VirtualBox 虛擬機之後,進入到 VirtualBox 虛擬機中點擊新建,創建一個系統

選擇分配的內存,我這里只是分配了 2G,如果正式使用 PaddlePaddle 訓練模型,這遠遠不夠,讀者可以根據需求分配內存

創建一個虛擬硬碟

選擇默認的 VDI 硬碟文件類型

這里最好是選擇動態分配硬碟,這樣虛擬機會根據實際佔用的空間大小使用電腦本身的磁碟大小,這樣會減少電腦空間的佔用率的。如果是固定大小,那麼創建的虛擬機的虛擬硬碟一開始就是用戶設置的大小了。

這里就是選擇虛擬硬碟大小的,最後分配 20G 以上,筆者分配 30G,應該夠用。

然後選擇剛才創建的 Ubuntu 系統,點擊設置,這系統中取消勾選軟碟機,然後點擊存儲,選擇 Ubuntu 鏡像,筆者使用的是 64 位 Ubuntu 16.04 桌面版的鏡像

最後就可以啟動安裝 Ubuntu 了。選擇我們創建的 Ubuntu 系統,點擊啟動,進入到開始安裝界面,為了方便使用,筆者選擇中文版的

為了安裝之後不用在安裝和更新應用,筆者勾選了安裝 Ubuntu 時下載更新,這樣在安裝的時候就已經更新應用了

然後是選安裝的硬碟,因為我們使用的自己創建的整一個硬碟,所以我們可以直接選擇青春整個硬碟並安裝 Ubuntu,這里就不用考慮分區和掛載問題了

選擇所在的位置,這沒什麼要求的,筆者隨便選擇一個城市

然後是選擇鍵盤的布局,通常的鍵盤布局都是英語(美國)

創建 Ubuntu 的用戶名稱和密碼

最後就是安裝了,這個安裝過程可能有點久,耐心等待

安裝完成之後就可以在 Windows 系統上使用 Ubuntu 系統了,我們再使用 Ubuntu 來學習和使用 PaddlePaddle 做深度學習了。最好安裝完成之後,把在存儲中設置的 Ubuntu 鏡像移除

在本篇文章之後部分都是在 Ubuntu 上操作,我們都可以使用 Ubuntu 這虛擬機來完成。
如果讀者使用的是 Windows 10,可以使用 Windows 系統自帶的 Linux 子系統,安裝教程可以看我之前的文章 Windows10 安裝 Linux 子系統。
使用 pip 安裝
如果你還沒有在 pip 命令的話,首先要安裝 pip,要確保安裝的 pip 版本是大於 9.0.0 的,否則可能無法安裝 paddlepaddle。
安裝 pip 命令如下:

sudo apt install python-pip
安裝之後,還有看一下 pip 的的版本 pip --version,如果版本低於 9.0.0,那要先升級 pip,先要下載一個升級文件,命令如下:

wget https://bootstrap.pypa.io/get-pip.py
下載完成之後,可以使用這個文件安裝最新的 pip 了

python get-pip.py
安裝 pip 就可以動手安裝 paddlepaddle 了。如果許可權不夠,請在 root 下執行命令
pip install paddlepaddle
現在就測試看看 paddlepaddle 有沒有,在 python 的命令終端中試著導入 paddlepaddle 包:

import paddle.v2 as paddle
如果沒有報錯的話就證明 paddlepaddle 安裝成功了。
使用 Docker 安裝
為什麼要使用 Docker 安裝 paddlepaddle 呢,Docker 是完全使用沙箱機制的一個容器,在這個容器安裝的環境是不會影響到本身系統的環境的。通俗來說,它就是一個虛擬機,但是它本身的性能開銷很小。在使用 Docker 安裝 paddlepaddle 前,首先要安裝 Docker,通過下面的命令就可以安裝了:

sudo apt-get install docker
安裝完成之後,可以使用 docker --version 查看 Docker 的版本,如果有顯示,就證明安裝成功了。可以使用 docker images 查看已經安裝的鏡像。
一切都沒有問題之後,就可以用 Docker 安裝 paddlepaddle 了,命令如下:

docker pull docker.paddlepaddlehub.com/paddle
在這里不得不說的是,這個安裝過程非常久,也許是筆者的帶寬太小了。安裝完成後,可以再使用 docker images 命令查看安裝的鏡像,應該可以 看到類似這樣一個鏡像,名字和 TAG 會相同,其他信息一般不同

docker.paddlepaddlehub.com/paddle latest 2b1ae16d846e 27 hours ago 1.338 GB
從源碼編譯生成安裝包
我們的硬體環境都有很大的不同,官方給出的 pip 安裝包不一定是符合我們的需求,比如筆者的電腦是不支持 AVX 指令集的,在官方中沒找到這個的安裝包(也行現在已經有了),所以我們要根據自己的需求來打包一個自己的安裝包。
在本地編譯生成安裝包
1. 安裝依賴環境
在一切開始之前,先要安裝好依賴環境,下面表格是官方給出的依賴環境

1.1 安裝 GCC
一般現在的 Ubuntu 都是高於個版本了,可以使用 gcc --version 查看安裝的版本。比如筆者的是 4.8.4,如果你的是版本是低於 4.8.2 的就要更新一下了

sudo apt-get install gcc-4.9
1.2 安裝 CMake
先要從官網下 CMake 源碼
wget https://cmake.org/files/v3.8/cmake-3.8.0.tar.gz
解壓源碼

tar -zxvf cmake-3.8.0.tar.gz
依次執行下面的代碼

# 進入解壓後的目錄
cd cmake-3.8.0
# 執行當前目錄的 bootstrap 程序
./bootstrap
# make 一下
make
# 開始安裝
sudo make install
查看是否安裝成功,cmake --version,如果正常顯示版本,那已經安裝成功了。
1.3 安裝 pip
關於安裝 pip9.0.0 以上的版本,在上面的使用 pip 安裝部分已經講了,這里就不在熬述了
1.4 安裝 numpy
安裝 numpy 很簡單,一條命令就夠了

sudo apt-get install python-numpy
順便多說一點,matplotlib 這個包也經常用到,順便安裝一下

sudo apt-get install python-matplotlib
1.5 安裝 SWIG
執行下面代碼安裝 SWIG,安裝成功之後,使用 swig -version 檢查安裝結果

sudo apt-get install -y git curl gfortran make build-essential automake swig libboost-all-dev
1.6 安裝 Go
官方說可選擇,那看情況吧,如果像安裝安裝吧,筆者順便安裝了,就一條代碼的事情,老規則 go version

sudo apt-get install golang
到這里,依賴環境就已經安裝好了,准備安裝 paddlepaddle。
2. 首先要在 GitHub 上獲取 paddlepaddle 源碼

git clone https://github.com/PaddlePaddle/Paddle.git
3. 然後輸以下命令

# 進入剛下載的 Paddle 裡面
cd Paddle
# 創建一個 build 文件夾
mkdir build
# 進入 build 文件夾里
cd build
# 這就要選好你的需求了,比如筆者沒有使用 GPU,不支持 AVX,為了節省空間,我把測試關閉了,這樣會少很多空間。最後不要少了..
cmake .. -DWITH_GPU=OFF -DWITH_AVX=OFF -DWITH_TESTING=OFF
# 最後 make,生成你想要的安裝包,這個可能很久, 一定要有耐心
make
經過長久的 make 之後,終於生成了我們想要的安裝包,它的路徑在 Paddle/build/python/dist 下,比如筆者在該目錄下有這個安裝包 paddlepaddle-0.11.0-cp27-cp27mu-linux_x86_64.whl,你的命名可能不是這個。之後就可以安裝了,使用 pip 安裝:

# 請切入到該目錄
cd build/python/dist/
# 每個人的安裝包名字可能不一樣。如果許可權不夠,請在 root 下執行命令

pip install paddlepaddle-0.11.0-cp27-cp27mu-linux_x86_64.whl
這個我們就已經安裝了 paddlepaddle,現在就測試看看 paddlepaddle 有沒有安裝成功了,在 python 的命令終端中試著導入 paddlepaddle 包:

import paddle.v2 as paddle
如果沒有報錯的話就證明 paddlepaddle 安裝成功了。
在 Docker 編譯生成安裝包
使用 Docker 就輕松很多了,有多輕松,看一下便知 。
1. 首先要在 GitHub 上獲取 paddlepaddle 源碼

git clone https://github.com/PaddlePaddle/Paddle.git
2. 切入到項目的根目錄下

cd Paddle
3. 生成安裝包
下面一行代碼,提醒一下,這個過程非常長,一定要有耐心,順便把編譯測試關了,減少空間

docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_AVX=OFF" -e "-DWITH_TESTING=OFF" docker.paddlepaddlehub.com/paddle:latest-dev bash -x /paddle/paddle/scripts/docker/build.sh
同樣會在 Paddle/build/python/dist 下生成一個安裝包,這對比在本地生成的安裝包,是不是要簡單很多,沒錯這就是 Docker 強大之處,所有的依賴環境都幫我們安裝好了,現在只要安裝這個安裝包就行了:

# 請切入到該目錄
cd build/python/dist/
# 每個人的安裝包名字可能不一樣。如果許可權不夠,請在 root 下執行命令
pip install paddlepaddle-0.11.0-cp27-cp27mu-linux_x86_64.whl
同樣我們要測試看看 paddlepaddle 有沒有安裝成功了,在 python 的命令終端中試著導入 paddlepaddle 包:

import paddle.v2 as paddle
如果沒有報錯的話就證明 paddlepaddle 安裝成功了。
編譯 Docker 鏡像
如果你比較喜歡使用 Docker 來運行你的 paddlepaddle 代碼,但是有沒有你想要的鏡像,這是就要自己來製作一個 Docker 鏡像了,比如筆者的電腦是不支持 AVX 指令集的,還只有 CPU,那麼我就要一個不用 AVX 指令集和使用 CPU 訓練的鏡像。好吧,我們開始吧
1. 我們要從 GitHub 下載源碼:

git clone https://github.com/PaddlePaddle/Paddle.git
2. 安裝開發工具到 Docker image 里

# 切入到 Paddle 目錄下
cd Paddle
# 下載依賴環境並創建鏡像,別少了最後的.

docker build -t paddle:dev .
有可能它不能夠命名為 paddle:dev,我們可以對他從重新命名,ID 要是你鏡像的 ID

# docker tag <鏡像對應的 ID> <鏡像名:TAG>
例如:docker tag 1e835127cf33 paddle:dev
3. 編譯
# 這個編譯要很久的,請耐心等待

docker run --rm -e WITH_GPU=OFF -e WITH_AVX=OFF -v $PWD:/paddle paddle:dev
安裝完成之後,使用 docker images 查看剛才安裝的鏡像。
測試安裝環境
我們就使用官方給出的一個例子,來測試我們安裝 paddlepaddle 真的安裝成功了
1. 創建一個記事本,命名為 housing.py,並輸入以下代碼:

import paddle.v2 as paddle
# Initialize PaddlePaddle.
paddle.init(use_gpu=False, trainer_count=1)
# Configure the neural network.
x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(13))
y_predict = paddle.layer.fc(input=x, size=1, act=paddle.activation.Linear())
# Infer using provided test data.
probs = paddle.infer(
output_layer=y_predict,
parameters=paddle.dataset.uci_housing.model(),
input=[item for item in paddle.dataset.uci_housing.test()()])
for i in xrange(len(probs)):
print 'Predicted price: ${:,.2f}'.format(probs[i][0] * 1000)
2. 執行一下該代碼
在本地執行代碼請輸入下面的命令
python housing.py
在 Docker 上執行代碼的請輸入下面的代碼

docker run -v $PWD:/work -w /work -p 8899:8899 docker.paddlepaddle.org/paddle python housing.py
-v 命令是把本地目錄掛載到 docker 鏡像的目錄上,-w 設置該目錄為工作目錄,-p 設置埠號,使用到的鏡像是在使用 Docker 安裝部分安裝的鏡像 docker.paddlepaddle.org/paddle
3. 終端會輸出下面類似的日誌

I0116 08:40:12.004096 1 Util.cpp:166] commandline: --use_gpu=False --trainer_count=1
Cache file /root/.cache/paddle/dataset/fit_a_line.tar/fit_a_line.tar not found, downloading https://github.com/PaddlePaddle/book/raw/develop/01.fit_a_line/fit_a_line.tar
[==================================================]
Cache file /root/.cache/paddle/dataset/uci_housing/housing.data not found, downloading https://archive.ics.uci.e/ml/machine-learning-databases/housing/housing.data
[==================================================]
Predicted price: $12,316.63
Predicted price: $13,830.34
Predicted price: $11,499.34
Predicted price: $17,395.05
Predicted price: $13,317.67
Predicted price: $16,834.08

Predicted price: $16,632.04
如果沒有成功運行該代碼,報錯信息如下,說明安裝的 paddlepaddle 版本過低,請安裝高版本的 paddlepaddle

I0116 13:53:48.957136 15297 Util.cpp:166] commandline: --use_gpu=False --trainer_count=1
Traceback (most recent call last):
File "housing.py", line 13, in <mole>
parameters=paddle.dataset.uci_housing.model(),

AttributeError: 'mole' object has no attribute 'model'
最後提示
有很多學習者會出現明明安裝完成 PaddlePaddle 了,但是在 PaddlePaddle 的時候,在初始化 PaddlePaddle 這一行代碼出錯

paddle.init(use_gpu=False, trainer_count=1)
這個多數是讀者的電腦不支持 AVX 指令集,而在 PaddlePaddle 的時候,安裝的是支持 AVX 指令集的版本,所以導致在初始化 PaddlePaddle 的時候報錯。所以在安裝或者編譯 PaddlePaddle 安裝包時,要根據讀者電腦本身的情況,選擇是否支持 AVX 指令集。查看電腦是否支持 AVX 指令集,可以在終端輸入以下命令,輸出 Yes 表示支持,輸出 No 表示不支持。
if cat /proc/cpuinfo | grep -i avx; then echo Yes; else echo No; fi
項目代碼
GitHub 地址:https://github.com/yeyupiaoling/LearnPaddle
參考資料
http://paddlepaddle.org/
https://pip.pypa.io/en/stable/
http://www.runoob.com/
http://www.linuxidc.com/Linux/2016-12/138489.htm
https://www.jianshu.com/p/c6264cd5f5c7

❸ 如何使用docker來製作我現在正在使用的系統的鏡像

在使用Docker的過程中,我們除了從Docker Hub上下載已經做好的鏡像,很多時候需要我們自己製作鏡像。下面想在這個文章中說明一下鏡像的製作方法。

製作鏡像的方式主要有兩種:

通過docker commit 製作鏡像
通過docker build 製作鏡像
這兩種方式都是通過改進已有的鏡像來達到自己的目的。製作基礎鏡像,會在另外一篇文章「從零開始製作基礎鏡像」中介紹。

docker commit
docker commit 是往版本控制系統里提交一次變更。使用這種方式製作鏡像,本質上是運行一個基礎鏡像,然後在基礎鏡像上進行軟體安裝和修改。最後再將改動提交到版本系統中。

選擇基礎鏡像
基礎鏡像的選擇要結合自己的需求。可以選擇已有的應用鏡像來改造,也可以選擇Ubuntu,Debian,OpenSuse這類基礎系統鏡像
我們以ubuntu為例子來說明
步驟1:運行ubuntu 鏡像
docker run -i -t ubuntu /bin/bash
步驟2:安裝軟體並修改軟體配置, 比如:安裝apache2
apt-get -yqq update
apt-get -y install apache2
安裝完成後,對apache2進行配置和修改
步驟3:退出docker並保存鏡像
使用「exit」命令退出容器
運行docker comit 命令, 進行保存
docker commit 61412230ae46 own-apache2

docker commit 命令參數說明

命令格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:

-a, --author= 提交的鏡像作者
-c, --change=[] Apply Dockerfile instruction to the created image, 沒用過
-m, --message= 提交時的說明文字
-p, --pause=true 在commit時,將container 暫停

CONTAINER:

可以使用container 的名字或者ID

REPOSITORY

指定鏡像倉庫,上述例子中,指定的是本地存儲
可以指定遠程鏡像倉庫,如docker hub。也可自建倉庫來存放image

TAG:

鏡像TAG

docker build
使用docker build創建鏡像需要編寫Dockerfile.

步驟:

編寫自己的Dcokerfile
運行docker build 命令打包鏡像

仍然以apache打包為例子。以下是Dockerfile的例子

FROM ubuntu:latest
MAINTAINER sky

#Add 163 mirror for apt
ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \ s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"]

編輯完成後,在與Dockerfile同一目錄下運行docker build 命令

docker build -t apache-img .

如果沒有命令出錯,docker build會持續運行直到鏡像創建完成
而創建的過程本質上是運行一個鏡像,然後在鏡像中按序執行在Dockerfile中的命令,直到執行結束。
如果中間有命令執行失敗,鏡像創建會停止。這時就需要看log,並修改Dockerfile,然後再次執行docker build

註:兩種鏡像創建方式的對比:

docker commit
docker build

難度相對容易,適合新手和對Linux不熟悉的用戶相對難,要求有一定的linux和腳本基礎知識

文檔化
文檔化在通過其他文件來實現
Dockerfile本身就是比較好的文檔,可讀和可理解性比較強。也可配合其他文檔帶來詳細說明

升級,維護
後續升級和維護麻煩,需要再次運行鏡像並對內部軟體進行升級或者安裝新軟體增加特性
後續升級和維護會相對簡單,可以直接在dockerfile中更改並增加新特性

具體選擇哪種方式來製作鏡像需要結合實際情況來選擇

Dockerfile 關鍵字詳解

FROM

FROM用來指定基礎包。在上面的例子中,基礎包用的是ubuntu。

MAINTAINER

鏡像作者信息,或者維護人員信息

ADD

將文件拷貝到Container內文件系統對應的路徑
格式 ADD <src file> <dst file>
所有拷貝到Container中的文件和文件夾許可權為0755,uid和gid為0
如果需要修改owner用戶或者許可權,需要使用RUN進行修改
ADD文件,文件路徑要在docker build<PATH>中指定的<PATH>下

RUN

創建鏡像時執行

ENV

用來設置環境變數

EXPOSE

Container內部服務開啟的埠
主機上如果要使用,還需要在啟動Container時,做host-container的商品映射
使用EXPOSE後,一些自動化布署工具可以直接讀取這個信息,自動進行埠映射
EXPOSE可以有多條,指定多個埠

WORKDIR

切換工作目錄,可進行多次切換(相當於cd命令)
切換目錄對RUN,CMD,ENTRYPOINT有效

USER

執行container的用戶,如未指定,則默認使用root用戶

ENTRYPOINT

Container啟動時執行的命令,一個Dockerfile中只能有一條ENTRYPOINT
ENTRYPOINT沒有CMD的可替換特性

CMD

Container 啟動時執行的命令,一個Dockerfile 中只能有一條CMD命令,如果有多條則只執行最後一條CMD
如果有多條命令希望在啟動後執行,可以考慮使用shell 腳本
與ENTRYPOINT的區別
CMD的主要用途是為可執行的container提供默認命令
CMD在運行時是可替換的,比如
在ubuntu中,CMD指定的是/bin/bash。默認情況下運行ubuntu,container中的/bin/bash會被執行
如果使用docker run指定運行命令,那CMD會被替換掉
如:docker run ubuntu /bin/echo "this is a echo". 這時,container 啟動後會執行echo 而不是/bin/bash了
ENTRYPOINT是不會替換的,如果在ubuntu鏡像中加入ENTRYPOINT,那ENTRYPOINT在啟動後會先被執行
CMD可以為ENTRYPOINT來提供參數
例子:

FROM ubuntu:14.10

ENTRYPOINT ["top", "-b"]
CMD ["-c"]

VOLUME

語法:VOLUME [PATH]
VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現數據共享或對容器數據的備份、恢復或遷移
可以將本地文件夾或者其他Container的文件夾掛載到Container中

❹ docker鏡像上怎麼運行service,systemctl

本文根據docker官方給出的docker代碼編譯環境搭建指南做更深入的分析。官方給出的指導比較簡單,但是由於國內的網路問題經常會編譯失敗,了解了編譯步驟後,也可以結合自身遇到的網路問題進行「規避」。 docker的編譯環境實際上是創建一個docker容...

❺ 如何在"特殊"的網路環境下編譯 Docker

由於 Docker 編譯需要依賴於 Docker Daemon ,所以只能在 64 位的 Linux 環境下先安裝 Docker 程序,再從 Github 上克隆 Docker 的代碼進行編譯。
在 Docker 的目錄下執行 make 命令將默認執行 Makefile 中 make binary 指令進行編譯。
?

default: binary

all: build
$(DOCKER_RUN_DOCKER) hack/make.sh

binary: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary

cross: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary cross

從以上的 Makefile 可以看出,執行 make、make binary、make all 或 make cross 都可以得到可運行的 Docker 程序。
在 Mac OS 環境下使用 brew 的命令安裝 Docker ,只能得到一個 docker client 的二進製程序,如果以 daemon 的方式運行,會得到 『This is a client-only binary - running the Docker daemon is not supported.』 的錯誤提示信息。
方法 1.
使用 VirtualBox 或者 VMWare Workstation 安裝一個 Linux 的虛擬機。宿主機使用 VPN 等方案使網路「正常」訪問各種「服務」,虛擬機網卡使用 NAT 模式。在 Linux 虛擬機內使用 make 進行編譯 Docker 不會有任何網路問題。只是編譯速度受限於 VPN 等網路解決方案,有可能等待時間很長。
方法 2.
Docker 每次發布新版本,都會在 docker-dev 的鏡像倉庫發布一個新的標簽,這個鏡像倉庫包含了編譯 Docker 鏡像所依賴的所有環境,只需替換 Docker 代碼目錄下的 Dockerfile 即可實現編譯 Docker 。
?

FROM docker.cn/docker/docker-dev:v1.2.0
VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux
ENTRYPOINT [「hack/dind」]
COPY . /go/src/github.com/docker/docker

Dockerfile 中只保留必要的步驟就可以實現編譯了。
方法 3.
對 Docker 代碼中的 Docker 進行徹底的改造,用國內的各種鏡像替換其中不能在「正常」網路條件下訪問的鏡像,使得代碼能夠快速編譯通過。
?

FROM docker.cn/docker/ubuntu:14.04.1
MAINTAINER Meaglith Ma <[email protected]> (@genedna)

RUN echo "deb http://mirrors.aliyun.com/ubuntu trusty main universe" > /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates universe" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted" >> /etc/apt/sources.list && echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list && echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security universe" >> /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
btrfs-tools \
build-essential \
curl \
dpkg-sig \
git \
iptables \
libapparmor-dev \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
parallel \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.0* \
unzip \
--no-install-recommends

RUN git clone --no-checkout https://coding.net/genedna/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103

RUN cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper

RUN curl -sSL http://docker-cn.qiniudn.com/go1.3.1.src.tar.gz | tar -v -C /usr/local -xz
ENV PATH /usr/local/go/bin:$PATH
ENV GOPATH /go:/go/src/github.com/docker/docker/vendor
ENV PATH /go/bin:$PATH
RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1

ENV DOCKER_CROSSPLATFORMS \
linux/386 linux/arm \
darwin/amd64 darwin/386 \
freebsd/amd64 freebsd/386 freebsd/arm
ENV GOARM 5
RUN cd /usr/local/go/src && bash -xc 'for platform in $DOCKER_CROSSPLATFORMS; do GOOS=${platform%/*} GOARCH=${platform##*/} ./make.bash --no-clean 2>&1; done'

RUN mkdir -p /go/src/github.com/gpmgo \
&& cd /go/src/github.com/gpmgo \
&& curl -o gopm.zip http://gopm.io/api/v1/download?pkgname=github.com/gpmgo/gopm\&revision=dev --location \
&& unzip gopm.zip \
&& mv $(ls | grep "gopm-") gopm \
&& rm gopm.zip \
&& cd gopm \
&& go install

RUN gopm bin -v code.google.com/p/go.tools/cmd/cover

RUN gem sources --remove https://rubygems.org/ \
&& gem sources -a https://ruby.taobao.org/ \
&& gem install --no-rdoc --no-ri fpm --version 1.0.2

RUN gopm bin -v -d /go/bin github.com/cpuguy83/go-md2man@tag:v1

RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox

RUN /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY' > /.s3cfg

RUN git config --global user.email '[email protected]'

RUN groupadd -r docker
RUN useradd --create-home --gid docker unprivilegeser

VOLUME /var/lib/docker
WORKDIR /go/src/github.com/docker/docker
ENV DOCKER_BUILDTAGS apparmor selinux

ENTRYPOINT ["hack/dind"]

COPY . /go/src/github.com/docker/docker

以上的命令把 Ubuntu 鏡像中的源替換為國內速度較快的阿里源;把 lvm2 鏡像到國內的 Git 託管服務 coding.net;從 七牛雲存儲 保存的 Golang 源碼進行獲取和編譯;使用 gopm 下載編譯所需要的 Library ;最後把其中 gem 源切換到淘寶。至此,可以在「特殊」的網路條件下快速編譯 Docker 。

❻ Docker如何創建鏡像怎麼修改,上傳鏡像

初次安裝部署好docker後,大多數鏡像可以從DockerHub 提取,但是大多數人都希望自己可以完全自定義一個鏡像,那麼這里需要一個第三方工具 febootstrap

epel6的源提供febootstrap的RPM包

yum install docker-io febootstrap -y

service docker start

chkconfig docker --level35 on
復制代碼
製作CentOS6.6鏡像目錄

febootstrap -i yum -i iputils -i iproute -i bash -i vim-minimal -i coreutils -i tar -i net-tools centos6 base <a href="http://centos.ustc.e.cn/centos/6.6/os/x86_64/" target="_blank">http://centos.ustc.e.cn/centos/6.6/os/x86_64/</a> -u <a href="http://centos.ustc.e.cn/centos/6.6/updates/x86_64/" target="_blank">http://centos.ustc.e.cn/centos/6.6/updates/x86_64/</a>
復制代碼
-i 表示鏡像裡面安裝的RPM包(包括一些人為有必要的軟體包)
centos6 表示鏡像的版本說明
base 表示生成的鏡像目錄
後面之後了系統安裝源和更新源為USTC

安裝執行後,會開始一系列的RPM包下載安裝,過程與yum類似,安裝完成後當前目錄會多了base目錄,裡面就是一個鏡像的系統文件

進入base目錄等於進入鏡像的根目錄

[root@image ~]# cd base/

[root@image base]# ls

bin boot dev etc home lib lib64 media mnt opt proc root sbin selinux srv sys tmp usr var
復制代碼
可以像一般的系統文件一樣先做一些修改配置,例如配置第三方yum源等等

把base目錄把所有文件打包成二進制文件後導入docker創建為鏡像

cd ~/root/base/ && tar -c . | docker import - centos6:base
復制代碼
docker images 可以查看鏡像的信息
一個基本centos鏡像創建完畢,下面再利用Dokcerfile製作mysql鏡像
cat Dockerfile

FROM centos6:base

MAINTAINER Lion "[email protected]"

VOLUME /var/lib/mysql

RUN yum install mysql-server mysql -y

RUN echo -ne "NETWORKING=yes\\nHOSTNAME=mysql" > /etc/sysconfig/network

RUN echo -ne "bind-address = 0.0.0.0\\ndefault-storage-engine=innodb\\ninnodb_file_per_table\\n\

collation-server=utf8_general_ci\\ninit-connect='SET NAMES utf8'\\ncharacter-set-server = utf8" > insert

RUN sed -i "/user=mysql/r insert" /etc/my.cnf && rm -f insert

RUN echo -ne "/usr/bin/mysql_install_db\\n/usr/bin/mysqld_safe" >> /opt/mysql_start

RUN chmod 777 /opt/mysql_start

ENV PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:

WORKDIR /opt

EXPOSE 3306

CMD /bin/sh -c mysql_start
復制代碼

FROM 聲明以centos:base鏡像為基礎
MAINTAINER 聲明鏡像的維護者信息
VOLUME 掛載本地目錄到容器里/var/lib/mysql目錄(這是mysql默認的數據保存目錄)
由於我希望數據可以持久化防止因為容器誤刪除而丟失,所以映射到宿主本地目錄
RUN 在鏡像中執行安裝mysql
在新鏡像中寫入HOSTNAME信息,因為mysql啟動過程需要network文件
在my.cnf配置文件插入一些修改配置
創建啟動腳本
聲明環境變數
制定默認工作目錄
EXPOSE 聲明容器需要暴露的埠號
CMD 是指鏡像生成容器後自動執行的命令,類似docker exec,這里是自動啟動mysql服務

根據Dockerfile創建mysql服務鏡像
docker build --rm=true -t mysql:frist .
查看鏡像的樹狀關系可以發現,mysql:frist是以centos:base為父鏡像

❼ Docker創建鏡像,怎麼修改,上傳鏡像等詳細

Docker的英文本意是碼頭工人,也就是搬運工,這種搬運工搬運的是集裝箱(Container),集裝箱裡面裝的可不是商品貨物,而是任意類型的App,Docker把App(叫Payload)裝在Container內,通過Linux Container技術的包裝將App變成一種標准化的、可移植的、自管理的組件,這種組件可以在你的latop上開發、調試、運行,最終非常方便和一致地運行在proction環境下。

Docker的核心底層技術是LXC(Linux Container),Docker在其上面加了薄薄的一層,添加了許多有用的功能。 這篇stackoverflow上的問題和答案很好地詮釋了Docker和LXC的區別,能夠讓你更好的了解什麼是Docker, 簡單翻譯下就是以下幾點:

Docker提供了一種可移植的配置標准化機制,允許你一致性地在不同的機器上運行同一個Container;而LXC本身可能因為不同機器的不同配置而無法方便地移植運行;

Docker以App為中心,為應用的部署做了很多優化,而LXC的幫助腳本主要是聚焦於如何機器啟動地更快和耗更少的內存;

Docker為App提供了一種自動化構建機制(Dockerfile),包括打包,基礎設施依賴管理和安裝等等;

Docker提供了一種類似git的Container版本化的機制,允許你對你創建過的容器進行版本管理,依靠這種機制,你還可以下載別人創建的Container,甚至像git那樣進行合並;

Docker Container是可重用的,依賴於版本化機制,你很容易重用別人的Container(叫Image),作為基礎版本進行擴展;

Docker Container是可共享的,有點類似github一樣,Docker有自己的INDEX,你可以創建自己的Docker用戶並上傳和下載Docker Image;

Docker提供了很多的工具鏈,形成了一個生態系統;這些工具的目標是自動化、個性化和集成化,包括對PAAS平台的支持等;

那麼Docker有什麼用呢?對於運維來說,Docker提供了一種可移植的標准化部署過程,使得規模化、自動化、異構化的部署成為可能甚至是輕松簡單的事情;而對於開發者來說,Docker提供了一種開發環境的管理方法,包括映像、構建、共享等功能,而後者是本文的主題。

❽ 請教,如何在ubuntu環境下編譯Docker的安裝文件

Docker 的基本用法
在本節中,我將向您介紹 Docker 命令的常用選項。例如如何下載一個 docker image,打造一個容器,以及如何訪問容器。
要創建一個新的容器,你應該選擇一個基本 image 的操作系統,例如啟動 Ubuntu 或者 CentOS 或其他系統。您可以搜索一個基本 image 使用 Docker 搜索命令:
docker search ubuntu
該命令將顯示所有 ubuntu images,你可以自己嘗試一下搜索 centos Images。

現在我們現在 base image到我們的服務中,使用命令:
docker pull ubuntu

現在,您可以通過使用命令來查看所有已下載的images:
docker images

Ubuntu 鏡像從DockerHub/Docker Registry下載。下一步驟是創建從該鏡像的容器。
要創建容器,可以使用docker create 或 docker run
docker create ubuntu:14.04
docker create 命令會創建一個新的容器,但不會啟動它。所以現在你需要使用運行命令:
docker run -i -t ubuntu:14.04 /bin/bash
此命令將創建並運行一個基於 Ubuntu14.04 鏡像的容器,容器內並運行一個命令/bin/bash,您將在容器內自動運行命令。

當你輸入 Exit 命令退出容器時,容器也是停止運行,如果你想容器在後台運行需要在命令後面添加 -d 參數。
docker run -i -t -d ubuntu:14.04 /bin/sh -c 「while true; do echo hello world; sleep 1; done」
/bin/sh -c 「while true; do echo hello world; sleep 1; done」 this is bash script to echo 「hello word」 forever.
現在你可以看到容器在後台運行通過命令:
docker ps
如果你想從 bash 命令看日誌結果,使用命令:
docker logs NAMES/ContainerID

怎樣在後台訪問容器 shell?這個命令將會連接你的容器 shell:
docker exec -i -t NAMES/ContainerID

你可以看到主機名和容器ID是相等的,這意味著你在容器shell內。當你在shell 上鍵入』exit`,會離開的shell,但容器仍在運行。
你會經常使用的另一個命令是:
docker stop NAME/ContainerID
這將停止容器而不將其刪除,這樣你就可以用命令重新啟動它:
docker start NAME/ContainerID
如果你想刪除的容器,先停止它,然後用命令將其刪除:
docker rm NAME/ContainerID

❾ Docker鏡像 問題

dockerpullhttpd

執行這個之後可以先用

dockerimages

查看一下已經下載了的鏡像

❿ 使用DockerFeile生成鏡像,裡麵包含了tomcat,jdk。最後啟動容器成功,訪問tomcat失敗!

容器啟動出錯

Dockerfile中CMD的不能使用&&符號的

可以使用

CMD ["sh","-c","start.sh && tail -F log"]

網頁鏈接

閱讀全文

與docker鏡像內無法完成編譯相關的資料

熱點內容
畢業設計單片機模擬 瀏覽:835
阿里ai雲伺服器 瀏覽:433
小程序雲伺服器可以綁個人賬戶嗎 瀏覽:727
王者榮耀體驗服ios怎麼登陸安卓的 瀏覽:285
客戶想要的與程序員理解的 瀏覽:669
矽谷一普通程序員的一天 瀏覽:456
演算法實現兩個集合合並 瀏覽:74
班長命令什麼意思 瀏覽:139
51單片機c語音 瀏覽:733
悅翔v3壓縮比 瀏覽:714
oppo怎樣修改手機里的文件夾名稱 瀏覽:218
PHP圖片上傳替換 瀏覽:139
androidtv桌面 瀏覽:810
miui10版本怎麼隱藏app 瀏覽:52
阿里雲伺服器怎麼輸入命令 瀏覽:426
如何通過伺服器連接網路 瀏覽:664
一張大事年表pdf 瀏覽:396
雞兔同籠java編程 瀏覽:611
應屆生php程序員簡歷 瀏覽:652
格力三匹壓縮機電流測哪根線 瀏覽:77