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