他是一個容器
Docker可以幫助用戶構建和部署容器,用戶值需要把自己的應用程序或者服務打包放進容器即可。
容器是基於鏡像啓動的,容器中可以運行一個或多個進程。我們可以認爲,鏡像是Docker生命週期中的構建或打包階段,而容器則是啓動或執行階段
總結起來,docker容器就是:
- 一個鏡像格式
- 一系列標準操作
- 一個執行環境
Docker資源
安裝docker
Linux(ContOs)安裝
- 使用命令 uname -a 確認內核是否是3.8以上版本
- 使用命令sudo grep device-mapper /proc/devices 或ls -l /sys/class/misc/device-mapper/ 檢查是否有Device Mapper(作爲docker的存儲驅動,爲docker提供存儲能力)
- vi /etc/sysconfig/selinux 將selinuxg改爲disabled SELINUX=disabled
- yum install -y docker 下載docker
- systemctl start docker contos7啓動docker
- 如果失敗報: Error starting daemon: SELinux is not supported with the overlay2 graph driver on ...=false),兩個解決方案:
- 啓動新的內核
- docker配置文件裏面裏禁用selinux,--selinux-enabled=false
vim /etc/sysconfig/docker
- docker info 查看docker是否啓動
- 將docker守護進程綁定到宿主機上的網絡接口,直接設置DOCKER_HOME環境變量來達到永久有效的方式:export DOCKER_HOST="tcp://0.0.0.0:2375"
- 檢測守護進程是否啓動,如果沒啓動會報沒有運行的錯誤,下列表格爲啓動的效果
[root@node129 ~]# service docker stop Redirecting to /bin/systemctl stop docker.service [root@node129 ~]# service docker start Redirecting to /bin/systemctl start docker.service |
Windows安裝
自動安裝
- 首先要確定安裝了curl命令,如果沒裝,執行 yum -y install curl
- 執行命令:curl https://get.docker.com/ | sudo sh
Docker入門
在進行操作前一定要確認docker程序已運行,功能是否正常,執行命令:docker info
該命令會返回所有容器和鏡像的數量,Docker使用執行驅動和存儲驅動以及Docker的基本配置。
而docker是基於客戶端-服務器的架構,它有一個docker程序,既能作爲客戶端也能作爲服務器端。作爲客戶端時,docker程序向Docker守護進程發送請求,然後在對返回的請求結果做處理。
創建一個容器
- docker run -i -t ubuntu /bin/bash 創建一個ubuntu容器(重官方提供的版本中拉取)
其中 /bin/bash命令啓動了一個Bash shell,下列圖就是用root用戶登錄到a5312w03eafc容器中。這是一個完整的ubuntu系統
簡單概述一下創建容器的全過程
首先docker會查詢本地是否存在ubuntu鏡像,如果沒有就去我們配置的鏡像網址去找(默認是Docker Hub官網上的地址),找到後會下載到本地宿主機中,隨後,Docker在文件系統內部用這個鏡像創建了一個新的容器。該容器擁有自己的網絡、IP地址,以及一個用來和宿主機進行通信的橋接網絡接口,最後我們就可以使用這個容器了。
使用容器
簡易操作,及命令安裝等
我們現在使用a5312w03eafc容器(ubuntu)中root用戶對他進行操作
所有命令跟該操作系統一致
hostname 查看主機名
查看hosts配置文件,下列圖中明顯可以看出來自動給他配了一個ip地址172.17.0.2
之後會發現docker提供的這個鏡像是真的難用,裏面大部分命令都沒有,比如ip、vim等,執行以下命令
apt-get update 更新
apt-get install vim -y vim文本編輯器
apt-get install net-tools ifconfig和ping命令
安裝完成後,檢查網絡配置,如下圖,這裏有lo的環回接口,有一個172.17.0.2的標準eth0網絡接口,和普通的宿主機一模一樣
檢查容器進程
關閉容器
輸入exit返回宿主機時,容器已經停止運行了!只有在指定的/bin/bash命令處於運行狀態的時候,我們的容器纔會運行。一旦退出,/bin/bash命令也就結束了,這時容器也隨之停止運行,但是容器還是存在的。運行docker ps -a查看容器列表
修改容器名稱
docker rename confident_brahmagupta dyc_docker_test
啓動關閉的容器
docker start dyc_docker_test 通過容器名啓動
docker start a5312e03eafc 通過ID啓動
docker stop dyc_docker_test 通過容器名關閉
docker stop a5312e03eafc 通過ID關閉
附着到正在運行的容器上
docker attach dyc_docker_test
當容器重新啓動時,會沿用docker run命令時指定的參數,因此我們的容器重新啓動後會運行一個交互式會話shell,此外,也可以用docker attach 命令,重新附着到該容器會話上
創建守護式容器
上面介紹的是交互式運行的容器,也可以創建長期運行的容器。守護式容器,沒有交互式會話,非常適合運行應用程序和服務。大多數時候我們都需要以守護式來運行我們的容器
docker run --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
-d 的意思是後臺運行,在這裏使用了腳本語言循環去輸出“hello world”,而且這邊沒有將主機的控制檯附着到新的容器中,先查看在運行的容器 docker ps(沒有加a的參數就只顯示正在運行的容器)
容器日誌
docker logs dyc_docker_sh 顯示最新的log
docker logs -f dyc_docker_sh 跟蹤守護式容器log
docker logs -ft dyc_docker_sh 跟蹤守護式容器log加上了時間
還可以在創建的時候使用日誌驅動,但這個時候在使用docker log就打印不出來日誌了,日誌已經全部重定向到Syslog中,如:
docker run --log-driver --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
如果是在Docker Toolbox中運行Docker,應該在虛擬機中啓動Syslog守護進程
查看容器內進程
docker top dyc_docker_sh
docker統計信息
如果你想在守護式中使用交互命令就必須使用以下命令,-t -i表示我們執行的進程創建了TTY並捕捉STDIN,注意使用交互命令時用exit退出該容器也繼續在運行,不會退出,守護式容器只能使用docker stop dyc_docker_sh停止,整體流程如第二幅圖:
docker exec -t -i dyc_docker_sh /bin/bash
容器自動重啓
docker run --restart=always --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
--restart=always 無論退出代碼是什麼都會重啓
--restart=on-failure:5 錯誤代碼爲非0時重啓,且重啓次數最多爲5次
獲取容器信息的不且是 docker ps還可以使用docker inspect dyc_docker_sh來獲取更爲信息的信息
簡單的對docker容器進行部署、操作以及基本的工作原理演示
使用Docker的鏡像和倉庫
什麼是docker鏡像
Docker鏡像是由文件系統疊加而成的,最低端是一個引導文件系統(bootfs),但是我們幾乎不會跟引導文件打交道,當一個容器啓動後,它會被移到內存中,而引導文件則會被卸載。
第二層是root文件系統(rootfs),它位於引導文件系統之上,rootfs可以是一種或多種的操作系統,在傳統的Linux系統中root文件系統最先以只讀的方式加載,等引導結束並且檢查完畢後,才改成可讀寫模式,而在docker中,root文件系統只能是隻讀狀態,並且在利用聯合加載技術,在root文件系統層上加載更多的只讀系統文件。聯合加載指的是一次同時加載多個文件系統,但是外面看起來只能看到一個文件系統,聯合加載會將各層文件系統疊加在一起,這樣最終的文件系統會包含所有底層的文件和目錄。
Docker將這樣的文件系統稱爲鏡像。一個鏡像可以放到另一個鏡像的頂部, 位於下面的鏡像稱之爲父鏡像。依次類推,直到鏡像棧的最底部,最底部的鏡像稱爲基礎鏡像。最後,當一個容器啓動時,docker會在該鏡像的最頂層加載一個讀寫文件系統。我們想在docker中運行的程序就是在這個讀寫層中執行的。
列出鏡像
本地鏡像都保存在Docker宿主機的 /var/lib/docker目錄下,鏡像是從倉庫下載的,倉庫位於Registry中。默認的Registry是在Docker提供運營的Docker Hub上
獲取所有鏡像列表:docker images
目前只有一個,我們在拉取一個Ubuntu 18.10鏡像
查看鏡像
- 直接從docker hub上查詢
- 使用docker命令:docker search ubuntu
構建鏡像
- 首先需要去docker gub上面註冊一個賬號,
- 註冊完成後在linux上輸入命令: sudo docker login
- 按提示輸入之前註冊好的賬號密碼,在這裏可能會出現Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 錯誤,該錯誤是因爲我們設置的dns有問題,請把他配置成8.8.8.8(谷歌),登陸成功,如下圖
他會把用戶的個人信息保存到~/.docker/config.json中
使用commit構建新鏡像
- sudo docker run -i -t ubuntu /bin/bash 拉取或進入鏡像中
- 爲這個鏡像安裝apache2 apt-get -yqq update apt-get -y install apache2
- 構造一個新的鏡像
- sudo docker commit ef6b519b1fe3 ubuntu_dyc/apache2 ( docker ps -l -q 可以查到剛剛使用的鏡像ID)
- sudo docker images ubuntu_dyc/apache2 查看新構建的鏡像
使用Dockerfile構建鏡像
在這裏並不推舉使用commit構建鏡像,推舉使用dockerfile的定義文件和docker build命令來構建鏡像,他比commit構建鏡像更具備可複製性、透明性及冥等特性
使用dockerfile的步驟:
- 創建一個存放Dockerfile的文件夾,並編寫Dockerfile文件
- mkdir static_web
- cd static_web
- touch Dockerfile
- vim Dockerfile
FROM ubuntu:14.04 MAINTAINER dyc "[email protected]" RUN apt-get update && apt-get install -y nginx RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html EXPOSE 80 |
- docker build -t dyc/static_web:v1 .
執行build命令時,Dockerfile中所有的指令都會被提交,並且在該命令成功結束後返回一個新鏡像,其中dyc爲倉庫名static_web鏡像名v1是標籤 請注意上面的命令 dyc.static_web 後面還有一個點. 這個代表他執行的位置,.代表當前目錄
- 查看鏡像是否存在
問題總結
1.
- docker對contos7的兼容度不夠,初始contos的內核是3.10版本,必須進行升級,升級後,內核爲:CentOS Linux release 7.6.1810 (Core)
- yum clean all
- Yum update
命令收集
service docker start |
開啓服務 |
|
service docker stop |
關係服務 |
|
docker info |
查看docker基本信息 |
|
docker version |
查看版本號 |
|
docker run -i -t ubuntu /bin/bash |
創建新容器 |
|
docker image ls |
查看鏡像文件 |
|
Docker rmi -f 鏡像ID |
刪除鏡像 |
|
docker rm 容器名 |
刪除容器 |
|
docker container ls |
列出hello-world在顯示其消息後退出的容器(由圖像生成) |
|
docker ps -a |
查看容器列表 |
|
docker run --name xxx -i -t ubuntu /bin/bash |
創建一個名稱爲xxx的容器,如果未加命名,則用容器ID代替 |
|
docker rename 原容器名 新容器名 |
修改容器名稱 |
|
docker start 容器名(ID名) |
啓動容器 |
|
docker stop 容器名(ID名) |
關閉容器 |
|
docker attach dyc_docker_test |
交互式容器如果啓動後,附着到正在運行的容器上 |
|
docker run --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" |
創建守護式容器 -d爲後臺運行的意思 |
|
docker logs dyc_docker_sh docker logs -f dyc_docker_sh docker logs -ft dyc_docker_sh
|
顯示最新的log 跟蹤守護式容器log 跟蹤守護式容器log加上了時間
|
|
docker run --log-driver --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" |
啓用日誌驅動,使日誌重定向到Syslog中去,在使用docker logs 命令將差不到日誌 |
|
docker pull fedora:20 |
|
|
sudo docker login |
登陸docker賬號,如果沒有創建,請到docker gub上註冊 |
|
Sudo docker commit 鏡像ID ubuntu_dyc/apa |
Commit方式構建新鏡像 |
|
sudo docker build -t dyc/static_web:v1 . |
首先創建Dockerfile文件,並編輯該文件之後 使用Dockerfile創建鏡像,後面的點是相對路徑 |