docker&&基本使用

安裝

ubuntu

環境

1.Docker 支持以下的 Ubuntu 版本:

  • Ubuntu Trusty 14.04 (LTS) (64-bit)
  • Ubuntu Precise 12.04 (LTS) (64-bit)
  • Ubuntu Raring 13.04 and Saucy 13.10 (64 bit)

2.Docker 需要在64位版本的Ubuntu上安裝
3.保證Ubuntu 內核的最小版本不低於 3.10

其中3.10 小版本和更新維護版也是可以使用的。
如果你的內核版本低於3.10,你需要升級你的內核

安裝docker

#腳本安裝
wget -qO- https://get.docker.com/ | sh
#If you would like to use Docker as a non-root user, you should now consider adding your user to the "docker" group with something like:
#  sudo usermod -aG docker your-user

遇到的問題:

root@dfq:~# docker run hello-world
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:297: copying bootstrap data to pipe caused \"write init-p: broken pipe\"": unknown.
ERRO[0000] error waiting for container: context canceled 

如果安裝完成後出現以上錯誤。請參考以下網址指定版本安裝即可。
https://blog.csdn.net/qq_34160679/article/details/89599320

非必須配置:

#創建docker用戶組並添加用戶
sudo  usermod -aG  docker  ubuntu
#此時docker用戶不使用sudo命令也可以執行docker命令

配置

默認存儲位置及鏡像存儲位置

參考地址:
https://my.oschina.net/u/228832/blog/1817292

獲取鏡像

#用熱點安裝了docker,然後用公司的網絡下載鏡像,出現以下問題。切回熱點後,又可以正常的下鏡像。
#root@ubuntu-virtual-machine:/home/ubuntu# docker pull ubuntu:14.04
#Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection #(Client.Timeout exceeded while awaiting headers)

root@ubuntu-virtual-machine:/home/ubuntu# docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete 
30bb187ac3fc: Pull complete 
b7a5bcc4a58a: Pull complete 
Digest: sha256:ffc76f71dd8be8c9e222d420dc96901a07b61616689a44c7b3ef6a10b7213de4
Status: Downloaded newer image for ubuntu:14.04
root@ubuntu-virtual-machine:/home/ubuntu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               6e4f1fe62ff1        2 months ago        197MB

從指定倉庫下載鏡像

sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04

dl.dockerpool.com:5000 : 需要指定完整的倉庫註冊服務器地址

查看鏡像的詳細信息(啓動時暴露的端口、目錄等)

[root@k8s-node04 ~]# docker image inspect d4a5e0eaa84f | grep -A3 -e "Cmd" -e "ExposedPorts"
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
--
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
--
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
--
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"

從本地文件系統導入、創建鏡像

要從本地文件系統導入一個鏡像,可以使用 openvz(容器虛擬化的先鋒技術)的模板來創建: openvz 的模板下載地址爲 templates 。
比如,先下載了一個 ubuntu-14.04 的鏡像,之後使用以下命令導入:

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz  |docker import - ubuntu:14.04

使用鏡像、創建容器

以交互式方式進入、操作容器

root@ubuntu-virtual-machine:/home/ubuntu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               6e4f1fe62ff1        2 months ago        197MB
#創建一個容器,讓其中運行 bash 應用
root@ubuntu-virtual-machine:/home/ubuntu# sudo docker run -t -i ubuntu:14.04  /bin/bash
root@bad19f086198:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

當前用戶退出,則容器停止!!!
-t : 讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上
-i : 讓容器的標準輸入保持打開。
-d : 在後臺運行容器

基於鏡像新建、啓動容器

sudo docker run -t -i ubuntu:14.04  /bin/bash

基於已停止容器、啓動容器

root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
f99d3f2b2d03        airetalk/lnmp:0.1   "/bin/bash"         About an hour ago   Exited (127) 6 seconds ago                       agitated_perlman
bad19f086198        ubuntu:14.04        "/bin/bash"         2 hours ago         Exited (130) 2 hours ago                         heuristic_wright
root@ubuntu-virtual-machine:/home/ubuntu# docker start f99d3f2b2d03
f99d3f2b2d03
root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
f99d3f2b2d03        airetalk/lnmp:0.1   "/bin/bash"         About an hour ago   Up 1 second                                    agitated_perlman
bad19f086198        ubuntu:14.04        "/bin/bash"         2 hours ago         Exited (130) 2 hours ago 

創建容器時,docker都進行了哪些操作

當利用 docker run 來創建容器時,Docker 在後臺運行的標準操作包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像創建並啓動一個容器
  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個 ip 地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢後容器被終止

進入在後臺運行容器

attach命令

root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
f99d3f2b2d03        airetalk/lnmp:0.1   "/bin/bash"         About an hour ago   Up 2 seconds                                   agitated_perlman
bad19f086198        ubuntu:14.04        "/bin/bash"         2 hours ago         Exited (130) 2 hours ago                       heuristic_wright
root@ubuntu-virtual-machine:/home/ubuntu# docker attach f99d3f2b2d03
root@f99d3f2b2d03:/# 

但是使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。

nsenter 命令

ubuntu14.04需要安裝最新版本的 util-linux(2.24)版

安裝nsenter

wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
cd util-linux-2.24
./configure  --without-ncurses && make nsenter
sudo cp nsenter /usr/local/bin
nsenter -V
    nsenter from util-linux 2.24

連接容器

#找到容器的第一個進程的 PID
root@ubuntu-virtual-machine:/home/ubuntu/util-linux-2.24# PID=$(docker inspect --format "{{ .State.Pid }}" f99d3f2b2d03)
root@ubuntu-virtual-machine:/home/ubuntu/util-linux-2.24# echo $PID
5875
#通過這個 PID,就可以連接到這個容器
root@ubuntu-virtual-machine:/home/ubuntu/util-linux-2.24# sudo nsenter --target $PID --mount --uts --ipc --net --pid
root@f99d3f2b2d03:/# dpkg -l| grep nginx

.bashrc_docker進入容器

#下載.bashrc_docker並將內容放入.bashrc中
wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
#獲取某個容器的 PID
echo $(docker-pid <container>)
#進入容器或直接在容器內執行命令。
docker-enter <container> ls

終止容器

root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
f99d3f2b2d03        airetalk/lnmp:0.1   "/bin/bash"         About an hour ago   Up 3 minutes                                   agitated_perlman
bad19f086198        ubuntu:14.04        "/bin/bash"         2 hours ago         Exited (130) 2 hours ago                       heuristic_wright
root@ubuntu-virtual-machine:/home/ubuntu# docker stop f99d3f2b2d03
f99d3f2b2d03
root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
f99d3f2b2d03        airetalk/lnmp:0.1   "/bin/bash"         About an hour ago   Exited (0) 2 seconds ago                       agitated_perlman
bad19f086198        ubuntu:14.04        "/bin/bash"         2 hours ago         Exited (130) 2 hours ago                       heuristic_wright

當Docker容器中指定的應用終結時,容器也自動終止。
如 sudo docker run -t -i ubuntu:14.04 /bin/bash : 用戶通過 exit 命令或 Ctrl+d 來退出終端時,所創建的容器立刻終止。

導出、導入容器到本地

導出容器到本地

root@ubuntu-virtual-machine:/home/dfq# docker export f99 >  airetalk_lnmp.tar
root@ubuntu-virtual-machine:/home/dfq# ls
airetalk_lnmp.tar

從本地導入容器鏡像到鏡像

root@ubuntu-virtual-machine:/home/dfq# cat airetalk_lnmp.tar | sudo docker import - airetalk/lnmp:2.1
sha256:68a5c80ffddbc7c66ef2cd9b7daebded157bc0654220f416028cb314f7203175
root@ubuntu-virtual-machine:/home/dfq# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
airetalk/lnmp       2.1                 68a5c80ffddb        19 seconds ago      206MB
#指定 URL 或者某個目錄來導入
sudo docker import http://example.com/exampleimage.tgz example/imagerepo

用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標籤等元數據信息。

刪除容器

root@ubuntu-virtual-machine:/home/dfq# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
f99d3f2b2d03        airetalk/lnmp:0.1   "/bin/bash"         3 hours ago         Up 2 hours                                     agitated_perlman
bad19f086198        ubuntu:14.04        "/bin/bash"         4 hours ago         Exited (130) 4 hours ago                       heuristic_wright
root@ubuntu-virtual-machine:/home/dfq# docker rm bad
bad
root@ubuntu-virtual-machine:/home/dfq# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f99d3f2b2d03        airetalk/lnmp:0.1   "/bin/bash"         3 hours ago         Up 2 hours                              agitated_perlman

如果要刪除一個運行中的容器,可以添加 -f 參數。Docker 會發送 SIGKILL 信號給容器

保存容器、提交鏡像

docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

-m : 來指定提交的說明信息,跟我們使用的版本控制工具一樣;
-a : 可以指定更新的用戶信息
0b2616b0e5a8 : 指定用來創建鏡像的容器的 ID
ouruser/sinatra:v2 : 指定目標鏡像的倉庫名(sinatra)和 tag(v2) 信息
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c : 創建成功後會返回這個鏡像的 ID 信息

利用 Dockerfile 來創建鏡像

創建Dockerfile文件

#新建一個目錄和一個 Dockerfile
root@ubuntu-virtual-machine:/home# cd /opt/
root@ubuntu-virtual-machine:/opt# mkdir dfq
root@ubuntu-virtual-machine:/opt/dfq# touch Dockerfile

編寫Dockerfile文件

Dockerfile 的基本語法

#編寫Dockerfile文件
vim /opt/dfq/Dockerfile
    # This is a comment
    FROM  ubuntu:14.04
    MAINTAINER Docker duanfuqiang <[email protected]>
    RUN apt-get -qq  update
    RUN apt-get -y  -qq  install  nginx
    # put my local web site in myApp folder to /var/www
    ADD myApp /var/www
    # expose httpd port
    EXPOSE 80
    # the command to run
    CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
  • 使用#來註釋
  • FROM 指令告訴 Docker 使用哪個鏡像作爲基礎
  • 接着是維護者的信息
  • RUN 開頭的指令會在創建中運行,比如安裝一個軟件包,在這裏使用 apt-get 來安裝了一些軟件
  • ADD 命令複製本地文件到鏡像
  • EXPOSE 命令來向外部開放端口
  • CMD 命令來描述容器啓動後運行的程序等

使用Dockerfile文件創建鏡像

#使用 docker build 來生成鏡像
sudo docker build -t="ouruser/sinatra:v2"  /opt/dfq/

-t : 添加 tag,指定新的鏡像的用戶信息。
/opt/dfq/ : Dockerfile 所在的路徑,也可以是相對路徑。
注意一個鏡像不能超過 127 層

修改鏡像的標籤

#用 docker tag 命令來修改鏡像的標籤。
root@ubuntu-virtual-machine:/opt/dfq# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
airetalk/lnmp       0.1                 3f64565ffe29        5 minutes ago       231MB
ubuntu              14.04               6e4f1fe62ff1        2 months ago        197MB
root@ubuntu-virtual-machine:/opt/dfq# sudo docker tag 3f64565ffe29 airetalk/lnmp:1.1
root@ubuntu-virtual-machine:/opt/dfq# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
airetalk/lnmp       0.1                 3f64565ffe29        6 minutes ago       231MB
airetalk/lnmp       1.1                 3f64565ffe29        6 minutes ago       231MB
ubuntu              14.04               6e4f1fe62ff1        2 months ago        197MB

上傳鏡像

用戶可以通過 docker push 命令,把自己創建的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上完成註冊後,可以推送自己的鏡像到倉庫中。

sudo docker push ouruser/sinatra
    The push refers to a repository [ouruser/sinatra] (len: 1)
    Sending image list
    Pushing repository ouruser/sinatra (3 tags)

導出鏡像到本地文件

root@ubuntu-virtual-machine:/opt/dfq# docker save -o  lnmp_1.1.tar airetalk/lnmp:1.1
root@ubuntu-virtual-machine:/opt/dfq# ls
Dockerfile  lnmp_1.1.tar

移除鏡像

如果要移除本地的鏡像,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器

root@ubuntu-virtual-machine:/opt/dfq# docker rmi airetalk/lnmp:1.1

在刪除鏡像之前要先用 docker rm 刪掉依賴於這個鏡像的所有容器.

從本地文件載入鏡像

root@ubuntu-virtual-machine:/opt/dfq# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
airetalk/lnmp       0.1                 3f64565ffe29        18 minutes ago      231MB
ubuntu              14.04               6e4f1fe62ff1        2 months ago        197MB
root@ubuntu-virtual-machine:/opt/dfq# docker load --input  lnmp_1.1.tar 
Loaded image: airetalk/lnmp:1.1
root@ubuntu-virtual-machine:/opt/dfq# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
airetalk/lnmp       0.1                 3f64565ffe29        18 minutes ago      231MB
airetalk/lnmp       1.1                 3f64565ffe29        18 minutes ago      231MB
ubuntu              14.04               6e4f1fe62ff1        2 months ago        197MB
#或
sudo docker load < ubuntu_14.04.tar

開機啓動

離線安裝docker

離線導入鏡像

參考資料

  • https://docs.docker.com/get-docker/
  • https://yeasy.gitbooks.io/docker_practice/content/index.html#docker
  • http://www.dockerinfo.net/document
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章