1. 程式人生 > >Docker:從環境搭建到容器埠對映

Docker:從環境搭建到容器埠對映

Docker初探

一.安裝DockerCE

1.為啥我要安裝DockerCE呢?其實我也不明白,稀裡糊塗就裝了CE版本:可以參考官方文件(https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#extra-steps-for-aufs) 另外我安裝Docker的系統是ubuntu16.04
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
經過以上幾步,恭喜你,DockerCE已經安裝完成了!!! 下面就是測試:
$ sudo docker run hello-world
如果安裝正確,那麼這條命令將從Docker官網上下載hello-world映象並在本地執行。

二.我理解的Docker

Docker只是一個用命令列來實現的虛擬機器。相較於WM,他的功能更加強大一點,可能和virtualbox相似(我沒用過VB,不過VB建立虛擬機器好像也可以用命令列)。不過Docker-machine、docker-compose、docker-swarm提供了比VM和VB更加強大的功能。值得一提的是,一般我們所講的Docker均是指Docker-engine,本篇文章講的Docker指的是docker-engine。等作者開始研究其他三個的時候再另發部落格。

三.images、container

VM以及VB在建立虛擬機器時需要使用iso映象檔案,然而docker不需要或者說他已經把映象檔案都傳到了官網上,我們只需要從Docker官網下載即可。
1.Images
首先是建立images,建立images有兩種方法,一種是使用docker pull。比如說我們要使用docker版的ubuntu系統,就可以使用docker pull ubuntu。更多的映象可以再https://hub.docker.com/中找到。另一種方法時使用dockerfile檔案,使用過程中更傾向於使用後者建立docker image。至於dockerfile的用法網上有很多例子。dockerfile其實很簡單,有興趣的可以網上學習一下,這裡簡單給一個安裝了c++以及boost執行環境的dockerfile:
FROM ubuntu:16.04
MAINTAINER Uncle_Orange <
[email protected]
> LABEL description="ubuntu C++ build environment." RUN apt-get update && apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - ADD sources.list /etc/apt/ RUN apt-get update && apt-get install -y \ # gcc \ # clang \ # cmake \ # libgtest-dev \ # libgoogle-glog-dev \ # libboost-all-dev \ # g++ `#Fb folly deps` \ # automake \ # autoconf \ # autoconf-archive \ # libtool \ # libboost-all-dev \ # libevent-dev \ # libdouble-conversion-dev \ # libgoogle-glog-dev \ # libgflags-dev \ # liblz4-dev \ # liblzma-dev \ # libsnappy-dev \ # make \ # zlib1g-dev \ # binutils-dev \ # libjemalloc-dev \ # libssl-dev \ # libiberty-dev\ build-essential\ libboost-all-dev\ cmake\ iputils-ping\ net-tools\ nano ENV LIBRARY_PATH=/libs ENV CPLUS_INCLUDE_PATH=/libs/include RUN mkdir /src RUN mkdir /build WORKDIR /build CMD ["/bin/bash"]
建立映象命令: 進入到dockerfile所在的資料夾,然後注意後面有'.'表示當前目錄。這樣就有自己的映象了。
docker build -t uo/ubuntu:v1.0 .
2.container
建立容器: docker run。具體引數不貼了,可以自己-h檢視一下。

四.容器埠對映

在https://docs.docker.com/get-started/part2/上有一個使用dcoker+python實現的一個簡單網頁,可以自己按照教程實現一下。該例子在建立容器的時候使用了
docker run -p 4000:80 friendlyhello
將容器作為web服務端,80埠對映到主機的4000埠上。並且在dockerfile中加入了expose 80這個命令(這個命令實現和docker run -p同樣的效果?還是必須和docker run -p配合使用?這個還沒試過,有興趣的朋友可以試一下,然後最好能告訴一下結果)總之在使用上述配置和命令後能從作者的主機直接訪問web伺服器,這也是官方例子給的結果。 那麼下面就進入正題了,如何在沒有配置的情況下任然能聯通呢?因為在開發過程中很多情況下多需要臨時增加埠是很常見的情況,網上找了兩種方法

Docker 給執行中的容器新增對映埠方法1  

  1. 獲得容器IP

    1. $ docker inspect `container_name`| grep IPAddress

    比如我的容器叫mysqlserver麼就輸入下列程式碼來獲取該容器的ip地址

    1. $ docker inspect mysqlserver | grep IPAddress

    執行完之後會發現我的mysqlserverdocker容器的ip地址為192.168.0.2

  2. iptables轉發埠

    比如我將容器的3306埠對映到主機的37221埠,那麼ip對應就寫入我的docker容器IP即可

    1. iptables -t nat -A DOCKER -p tcp --dport 37221-j DNAT --to-destination 192.168.0.2:3306

Docker 給執行中的容器新增對映埠方法2

  1. 提交一個執行中的容器為映象

    1. $ docker commit containerid foo/live
  2. 執行映象並新增埠

    1. $ docker run -d -p 8000:80 foo/live /bin/bash
關於第一種方法,嘗試之後失敗了。(個人估計可能在dockerfile中有expose 37221這一命令,但是docker run的時候沒寫的-p 37221情況下該種方法有用。我說情況是dockerfile中沒寫,run中也沒有-p引數)第二種方法沒有嘗試。 對比官方給的web伺服器的例子,使用iptables -t nat -nL以及iptables -t filter-nL檢視防火牆可以看到,其實就是增加了幾條規則。或者說docker-p引數以及dockerfile中的expose關鍵字其實就是在使用iptables增加規則。 知道了這個就好辦了,下面是樓主的解決辦法: sudo iptables -t filter -A DOCKER -p udp -d 172.17.0.2 --dport 9876 -j ACCEPT
sudo iptables -t nat -A DOCKER -p udp --dport 9876 -j DNAT --to-destination 172.17.0.2:9876
沒錯,就只有兩行!!!!這兩行試了做好久, 同時貼上幾個相關帖子: http://blog.csdn.net/u011350541/article/details/50781040
http://blog.csdn.net/cooling88/article/details/51040054
https://www.cnblogs.com/kevingrace/p/5865792.html
至於驗證嘛,作者寫了一個udp發信資訊的服務端,傳到了所建立的uo/ubuntu中,然後從主機上傳送udp訊息。可以看到所建立的容器能正確接收到資訊。 順便在這裡提一下作者的網路拓撲: 作者主機:192.168.10.2 安裝docker的虛擬機器:192.168.10.100 容器IP:172.17.0.2 作者直接向192.168.10.100:9876發信udp包,在172.17.0.2中能正確接收資訊。相當於192.168.10.100做了一次nat轉換(截圖就不截了)

備註:Docker-machine、docker-compose、docker-swarm、docker-volume都需要研究一下,其中docker-colume和共享儲存服務無縫切換有關。等下次研究一下再繼續更新

相關推薦

Docker:環境搭建容器對映

Docker初探 一.安裝DockerCE 1.為啥我要安裝DockerCE呢?其實我也不明白,稀裡糊塗就裝了CE版本:可以參考官方文件(https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#

Docker 如何動態修改容器對映

前言:Docker埠對映往往是Docker Run命令時通過-p將容器內部埠對映到宿主機的指定埠上,一般來說容器的埠所對應的埠是提前確定需要對映的。但是有些情況下不得不需要臨時對映埠,例如Docker中執行著MySQL容器,預設埠是不開放的。那麼有什麼辦法可以讓執行中的容器暴露指定的埠呢?客官請往下看--->

docker容器對映容器間關聯,倉庫搭建(不加密,加密,加密認證)

一,容器埠對映: [root@foundation92 Desktop]# docker run -d --name web -p 8080:80 nginx #將本機的8080埠對映到容器的80埠 [root@foundation92 Desktop

Docker更改容器對映

#先停止容器 docker stop containerA #將容器commit成為一個映象 docker commit containerA newImageB #執行容器 docker run -p 8080:8080 -p 8081:8081 -v /home/data/:/home/data

通過配置檔案修改docker容器對映

有時候,我們需要給正在執行的容器新增埠對映,百度一下發現很多都是通過iptables,或者是通過將當前容器通過docker commit命令提交為一個映象,然後重新執行docker run命令新增埠對映。這種方法雖然可以,但是感覺好像有點南轅北轍,沒有必要啊。看了很多文章,貌

修改docker容器對映的方法

大家都知道docker run可以指定埠對映,但是容器一旦生成,就沒有一個命令可以直接修改。通常間接的辦法是,儲存映象,再建立一個新的容器,在建立時指定新的埠對映。 有沒有辦法不儲存映象而直接修改已有的這個容器呢?有。在stackoverflow上面找到答案了,原帖如下

docker啟動容器對映錯誤

 今天用docker的swarm搭建了一個叢集,在啟動主節點的swarm的時候出錯了,報的錯誤是: /usr/bin/docker-current: Error response from daemo

docker python3環境搭建

文件 python 環境 dao 鏡像 host doc name docker 1、使用鏡像為daocloud的python鏡像 docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp

Android APP和 Weex混合開發環境搭建到APP工程執行

一、簡言 目前Android可行的混合程式設計方案有Weex和ReactNative兩種方案,兩者基本類同,只是使用框架技術有點不一樣。從網上的資料可以查知到Weex相比ReactNative更容易上手,另外ReactNative在處理IOS端的長列表時容易出現記憶體洩漏。關於Weex和

Docker Swarm 環境搭建

pen man lead lose 之間 rpm 使用 img mman Docker Swarm 環境搭建 swarm 使用前提 1、Docker版本1.12+ Docker升級教程:https://www.cnblogs.com/xiangsikai/p/9935894

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast)搭建分散式部署(後端篇)

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast)搭建分散式部署(後端篇) 寫在前面:注:閱讀本文前,請先閱讀docker標籤的docker簡易系列的文章。 後端最終實現的架構圖: 第一步 簡單瞭解人人開源專案renren-fast 官網:h

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast-vue)搭建分散式部署(前端篇)

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast-vue)搭建分散式部署(前端篇) 寫在前面:注:閱讀本文前,請先閱讀docker標籤的docker簡易系列的文章。 前端最終實現的架構圖: 第一步 修改前端專案配置 修改專案目錄中 static/co

Mysql叢集講解(五) 多主多環境搭建

https://www.cnblogs.com/liudongdong666666/p/7818240.html A:概述:  一主多從,可以緩解讀的壓力,但是一旦主宕機了,就不能寫了; 所以我們可以採用雙主雙從架構       架構規劃:

網站伺服器服務搭建對映

啟動Apache(或者Tomcat)和MySQL (我本人子在網站根目錄下沒有放置主頁,在子目錄下放,有方便除錯不同的專案,在上線的網站都是在主頁放置index檔案的例如index.html或者index.php之類的) 購買隧道並且配置

MySql多例項配置及一主多環境搭建

主從複製原理 當 master 主伺服器上的資料發生改變時,則將其改變寫入二進位制日誌檔案中 salve 從伺服器會在一定時間間隔內對 master 主伺服器上的二進位制日誌進行探測,探測其是 否發生過改變 如果探測到 master 主伺服器的二進位制日誌發生了改變,則開始一個

環境搭建開始學習使用Google Protocol Buffer和gRPC

首先安裝 golang/protobuf Golang 語言版本的 API 時,需要先安裝標準 C++ 實現的 protocol buffer google/protobuf,使用linux的話就是先到github上下載對應的二進位制檔案 下載完解壓之後將bin目錄加

play framework 環境搭建到簡單執行

download 官網:https://www.playframework.com/ 將zip下載至本地,進行unzip。 環境變數 檢測是否安裝成功:解壓成功後進入解壓的目錄,執行 play 終端顯示 zsh: command not found: play

Docker環境搭建與使用

一.Docker的環境搭建 前言:本章介紹下在Ubuntu上的環境搭建過程 1.首先介紹下Docker: PS:具體的介紹我在這裡就不再贅述了,本文主要具體介紹下搭建過程與使用方法。 2.那麼首先我們來搭建Docker服

CentOS7+Docker+Redis3環境搭建

建立一個redis docker容器 首先,我們先為redis建立一個Dockerfile檔案和fix-permissions.sh檔案 Dockerfile: # "ported" by Adam Miller <[email protected]&

容器對映到主機探究

容器的網路 在說埠之前,先明確下docker 容器的網路,可以用過docker network命令常看docker的網路: # docker network ls NETWORK ID NAME DRIVER 33b01b58a9a2