1. 程式人生 > >docker 命令簡介

docker 命令簡介

docker 簡介

docker是什麼呢?給大家描述幾個應用場景吧,描述完大家大概就知道這個東西是用來幹嘛的了。

場景1

  • 相信稍微有點經驗的程式設計師在開發的過程中都面臨著部署應用的問題,假設你現在在本地辛辛苦苦開發出了一個網站,準備部署。這個時候你就很自然的聯想到應該在伺服器上搭建一個和本地執行環境一樣的環境出來。如果是nodejs,雖然已經有了npm,有了各種打包工具,可是你還是面臨著一系列的操作。而且最後還是有可能執行不起來,因為你的應用可能依賴於系統,讀寫系統檔案,或者某些檔案忘記拷貝之類的錯誤,讓人難受。而在有了docker之後呢,你可以很方便的將應用通過docker打包起來,從而解決執行環境不一致而導致應用不能執行的問題。

場景2

  • 現在假設,你和你的同事把自己編寫好的程式碼都放到了一個程式伺服器裡面執行。不小心的是,你的同事程式有問題,記憶體洩漏而且還很嚴重,吃記憶體而且還吃得特別的多。尷尬了,你的程式碼一放上去,跑不起來,報錯,執行特別的慢。這個時候如果你們的程式是用docker管理的話,這個問題就自然而然的解決了,在執行之前docker會限制好每個應用可用的記憶體和CPU,並將其和其他的程序隔離。這樣你就可以安心的跑程式碼了~

場景3

  • 假設現在你面對一個全新的作業系統,裡面沒有任何應用。現在你寫了一個java web應用。依賴了非常多的東西,有mysql,tomcat,jdk等等等等。你需要一個個的把他們裝上去,有過類似經歷的相信大家都知道,這個過程並不好受,保不住就可能遇到一些問題,然後就需要你話大把大把的時間去配置環境。有了docker之後呢?嘿嘿,這些就免了吧,因為這些依賴都會被放進一個叫做映象的東西,你的程式碼可以在映象裡面尋找依賴,完成執行。而你的系統呢,只需要一個docker就好了~

聽完上面的描述,docker是不是很誘人啊~在這裡給大家推薦一個docker的視訊教程,挺不錯的:

想要對docker有更深入的瞭解,可以去看這個視訊,我也是從這個視訊過來的,算是個小白。這篇部落格也算是一個筆記吧~

簡單docker執行流程

主要是為了幫助到家快速的建立起對docker一個簡單的印象,這裡放上幾個一連串的命令,大家執行完命令之後就就可以看到第一個docker執行之後的效果。這個,兩分鐘入門,最多了哈哈哈

$su
#apt install docker.io
#service docker start
#docker pull hello-world #docker run hello-world

在第一個run執行完畢之後呢,會有一段輸出


Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

這裡說了一下你執行這個hello world所發生的一些事情。這裡給大家翻譯一下

  1. docker 客戶端連線到docker的守護程序(守護程序:在linux或者unix作業系統中,守護程序(Daemon)是一種執行在後臺的特殊程序,它獨立於控制終端並且週期性的執行某種任務或等待處理某些發生的事件。)
  2. docker的守護程序在收到client的命令之後從Docker Hub(Docker官方的映象中心,裡面存放了很多各種各樣的映象),下載hello-world映象。
  3. 然後你執行了run命令,守護程序會在映象(這裡可以假設會某一種環境)建立一個容器,這個容器會執行指定的可執行檔案或者命令。
  4. 守護程序通過流的方式將執行的輸出傳送到你的終端。

上圖
這裡寫圖片描述

docker基礎命令

記錄一些docker的命令,為了以後可以很方便的查閱,也希望為其他人在學習docker的時候提供一些幫助。

ps: 以上內容都是在ubuntu 16.04 下完成的

  • 安裝docker
$ sudo apt install docker.io
  • 檢視docker版本
$docker version
[out]
    version   Show the Docker version information
    volume    Manage Docker volumes
    wait      Block until a container stops, then print its exit code

Run 'docker COMMAND --help' for more information on a command.
[email protected]:~/pro/js/webapp$ docker version
Client:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   78d1802
 Built:        Tue Jan 31 23:35:14 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
[ps: 這裡指示沒有連線到 docker daemon.目前所知的兩個原因:1. 普通使用者似乎檢視不到伺服器的狀態,2. 服務沒啟動]
  • 啟動docker 服務
$ sudo service docker start
  • 拉取映象
$ sudo docker pull [OPTIONS] <image_name>[:TAG]
[ps] 不加sudo會提示服務沒有執行,這是因為許可權的問題,大概是普通使用者沒有許可權修改檔案之類的吧

這裡推薦大家用網易蜂巢的docker映象倉庫,無他,唯快爾!(在國內,起碼比docker hub快)

  • 檢視映象
$ sudo docker images 

ps: 太麻煩了,建議大家在處理docker的時候還是直接使用su 命令,使用root使用者的身份來吧。不然每個命令前面都要加上sudo。

  • 執行映象
# docker run hello-world
  • 後臺執行映象
    一般用於那種需要一直在後臺執行的應用,比如說伺服器啊~這樣的話,就不需要長期佔用一個視窗了
# docker run -d hello-world
  • 檢視正在執行的映象
# docker ps
  • 進入正在執行的映象
# docker exec --help
[out]
Run a command in a running container

  -d, --detach         Detached mode: run command in the background
  --detach-keys        Override the key sequence for detaching a container
  --help               Print usage
  -i, --interactive    Keep STDIN open even if not attached
  --privileged         Give extended privileges to the command
  -t, --tty            Allocate a pseudo-TTY
  -u, --user           Username or UID (format: <name|uid>[:<group|gid>])

常用的格式是:

# docker exec -it <docker_image_id(可不完整,能識別就行)> bash

通過上面那條命令,你可以進入一個docker為了執行程式而虛擬出來的一個作業系統。

  • 結束正在執行的映象
# docker stop <docker_image_id>
  • 使用橋接的方式進行埠對映

ps: 為了幫助理解,這裡為docker的網路做一個簡單的介紹。docker中的網路模式一共有三種:bridge, host, none。最後一種是不開放任何網路,執行的映象和外界沒有任何聯絡。第一個和第二種的話,看圖
這裡寫圖片描述
host模式下,主機網絡卡和docker container直接相連。也就是說,訪問的主機的埠相當於是直接訪問container 埠。而在bridge模式下,會有一個埠對映的過程,將主機的一個埠對映到container中,當主機的某一個埠有請求的時候,會通過主機網絡卡到bridge再到container中,請求返回的內容會按照一樣的順序返回到主機網絡卡再出去。docker預設的啟動方式為bridge
+ 指定對映埠

# docker run -d -p 8080:80 nginx(假設容器的名稱為nginx)

這樣當你訪問主機的8080埠的時候,請求會被docker container中的80埠處理並返回出來。

  • 對映到隨機埠
    將開放的所有埠對映到一個隨機埠中
# docker run -d -P nginx