Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。html
docker三大理念java
一,構建python
二,運輸mysql
三,運行nginx
像java一次構建處處運行git
能夠把運行環境和代碼總體打包github
docker組成web
安裝dockerredis
yum -y install dockersql
啓動
docker是C/S結構 docker進程能夠了解爲server端執行命令理解爲client端,若是把docker進程停了其餘client也沒法運行(不一樣於KVM進程宕機了虛擬機還繼續運行)
docker組件
a,鏡像(Image) 相似於虛擬機的鏡像,組成不一樣,做用是同樣的
b,容器(Container) 相似於運行KVM虛擬機,至關於從鏡像建立了一個實例,容器間相互是隔離的,不一樣於虛擬機那樣是完全隔離
c,倉庫(Repository) 相似於yum倉庫,github
PS:容器能夠理解爲一個簡化版的Linux環境
docker與虛擬機的區別
虛擬機的應用運行在操做系統上,docker直接運行不須要操做系統
PS:虛擬機用戶資源是徹底隔離的
docker能夠實現狀態的回滾
docker的做用
1,簡化配置,代碼和環境在一塊
2,代碼流水線管理
3,提升開發效率
4,隔離應用
5,整合服務器
6,提升調試能力
7,多租戶環境
8,快速部署
啓動docker
systemctl start docker
(會產生一個docker的網橋)
docker的網絡訪問
與kvm同樣是經過橋接的方式訪問
搜索鏡像
docker search centos
下載鏡像
docker pull centos:7.2.1511
查看鏡像
docker images
PS:不是pull下載的使用docker load --input centos.tar導入後再使用docker images查看
pull下來使用docker save -o centos.tar centos導出鏡像
刪除
docker rmi 鏡像id
運行
docker run centos:7.2.1511 /bin/echo 'hello world'
PS:鏡像名稱centos必須在全部選項後面
不自定義名稱會自動生成一個名稱
查看在運行過的
docker ps -a
本身定義一個啓動的docker的name
docker run --name mydocker -t -i centos:7.2.1511 /bin/bash
PS:-t啓動僞終端 -i標準輸入
僞終端能夠運行各類命令
PS:進入了容器可是不是一個虛擬機,實際上是一個進程,進程結束了容器就結束了
中止的容器再啓動
docker start mydocker
登陸這個容器
docker attach mydocker
exit退出之後這個容器也關閉了
刪除
docker rm mydocker
PS:後面接容器名或者是容器ID
使用
nsenter鏈接
啓動容器先獲取Pid
docker inspect -f "{{ .State.Pid }}" mydocker
28254
nsenter -t 28254 -m -u -i -n -p
退出之後這個容器不會終止
寫個腳本實現以上功能
vim docker_in.sh
#!/bin/bash #Use nsnter to access docker docker_in(){ NAME_ID=$1 PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID) nsenter -t $PID -m -u -i -n -p } docker_in $1
sh docker_in.sh mydocker
不進入容器執行一個命令
docker exec mydocker whoami
root
也能使用exec進入容器
docker exec -it mydocker /bin/bash
PS:建議使用nsenter進入容器由於使用exec進入可能會致使一些奇怪的問題
刪除容器
docker rm mydocker
若是想刪除正在運行的容器
docker rm -f mydocker
PS:能夠在運行容器的時候加-rm參數 當一個容器運行完會自動刪除
pull一個nginx
docker pull nginx
docker run -d nginx
-d後臺運行而且輸出id
怎麼訪問這個nginx
查看容器訪問日誌
docker logs c4aefb55c183 由於剛剛沒有取name 因此這個用的是id
docker的網絡訪問
帶端口啓動
docker run -d -P nginx
把本機10000端口映射到80端口
訪問如下
curl 127.0.0.1:10000
使用命令查看訪問日誌
docker logs 6c43246b6ce3
指定端口映射
docker run -d -p 10.13.85.9:81:80 --name mynginx nginx
本地ip是10.13.85.9 端口81映射到容器的80端口
訪問
單獨查看端口映射
docker port mynginx
也能夠一次性啓動多個端口
docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx
docker數據管理
啓動數據卷
docker run -d --name nginx-volume-test1 -v /data nginx
進入
./docker_in.sh nginx-volume-test1
輸入
mount
退出
docker inspect -f {{.Mounts}} nginx-volume-test1
進入到對應的目錄
/var/lib/docker/volumes/014fa27d7fea367252f91445c6268f1376b67357ca51f0163f7dc480174cbc5a/_data
新建一個文件
touch hehe
新建一個窗口進入容器
ls /data 就能看到新建的那個文件hehe了
另一種掛載方式
新建一個目錄
mkdir -p /data/docker-volume-nginx
啓動容器掛載
docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data/ nginx
進入容器
./docker_in.sh nginx-volume-test2
cd /data
touch hehe
退出在目錄/data/docker-volume-nginx下面就有了文件hehe
PS:第二種方式比較經常使用,掛載數據致使移植性差
掛載單個文件
docker run --rm -it -v /root/.bash_history:/.bash_history nginx /bin/bash
PS: --rm參數退出後自動中止刪除這個容器
數據卷容器
可讓數據在多個容器之間共享
docker run -it --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash
能夠訪問 nginx-volume-test2掛載的目錄
PS:即便中止了容器nginx-volume-test2仍是同樣能夠訪問
docker stop nginx-volume-test2
使用這種方式掛載不須要指定掛載目錄了和源鏡像掛載目錄同樣
Docker改變了什麼
面向產品: 產品交付
面向開發: 簡化環境配置
面向測試: 多版本測試
面向運維: 環境一致性
面向構架: 自動化擴容(微服務)
docker鏡像的構建
1,手動構建
先kill掉全部運行的容器
docker kill $(docker ps -a -q)
刪除全部容器
docker rm $(docker ps -a -q)
PS:生產最好不用這樣作
構建
docker run --name mynginx -it centos
yum安裝nginx
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx
編輯nginx配置文件
vim /etc/nginx/nginx.conf
加一行(尾部增長便可不是加在http裏面)
daemon off;
PS:不能少掉;符號
表明nginx在前臺運行
exit退出
提交到本地
docker commit -m "My Nginx" 0ef327b06604 oldboy/mynginx:v1
啓動
docker run --name mynginxv1 -d -p 81:80 oldboy/mynginx:v1 nginx
PS:這裏末尾nginx並不是nginx鏡像而是nginx啓動命令
訪問
訪問日誌
sh docker_in.sh mynginxv1
vi /var/log/nginx/access.log
使用命令構建新建目錄
vim Dockerfile
# This Dockerfile #Base image FROM centos MAINTAINER Jason.Zhao xxx@gmail.com #Commands RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm RUN yum -y install nginx && yum clean all RUN echo "daemon off;" >> /etc/nginx/nginx.conf ADD index.html /usr/share/nginx/html/index.html EXPOSE 80 CMD ["nginx"]
新建首頁文件和Dockerfile在同一目錄
echo "nginx in docker,hahha" >>index.html
構建
docker build -t mynginx:v2 .
生成了 查看一下
啓動
docker run --name mynginx2 -d -p 82:80 mynginx:v2
訪問82端口就是現實剛剛是index.html內容
CMD只能使用一次,加入使用了CMD在啓動容器的時候優先使用指定的啓動命令
生存環境構建docker鏡像
分層設計
cd /root/docker/system/centos
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
mv /etc/yum.repos.d/epel.repo .
vim Dockerfile
#Docker for CentOS #Base image FROM centos #Who MAINTAINER Liuyueming #EPEL ADD epel.repo /etc/yum.repo.d/ #Base pkg RUN yum -y install wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all
構建
docker build -t oldboy/centos:base ./
PS:以上及把生產環境所需的最基礎的包yum安裝上,其餘環境能夠在此基礎上繼續構建,而不是其餘環境須要這些包從新再安裝一遍
建立應用環境就from oldboy/centos
cd /root/docker/runtime/python
vim Dockerfile
#Base image
FROM oldboy/centos:base
MAINTAINER Liuyueming
RUN yum install -y python-devel python-pip
#Upgrade pip
#RUN pip install --upgrade pip
構建
docker build -t oldboy/python ./
PS:加上升級pip的會報錯
構建一個帶ssh的
cd /root/docker/system/centos-ssh
#Docker for CentOS #Base image FROM centos #Who MAINTAINER Liuyueming #EPEL ADD epel.repo /etc/yum.repo.d/ #Base pkg RUN yum -y install openssh-clients openssl-devel openssh-server wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all #For SSHD RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key RUN echo "root:oldboy"|chpasswd
構建
ocker build -t oldboy/centos-ssh ./
python也基於centos-ssh構建
cd /root/docker/runtime/python-ssh
vim Dockerfile
#Base image FROM oldboy/centos-ssh:latest MAINTAINER Liuyueming RUN yum install -y python-devel python-pip #Upgrade pip #RUN pip install --upgrade pip
docker build -t oldboy/python-ssh ./
使用這個運行一個python測試腳本
cd
/root/docker/app/shop-api
vim app.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello World!' if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
yum -y install python-pip
pip install flask
運行
python app.py
使用5000端口提供服務
訪問
插入學習supervisor進程管理
yum -y install supervisor
vim /etc/supervisord.conf
docker倉庫
做業:須要https加認證nginx
1,申請免費ssl證書(沃通)
2,部署
3,設置驗證
4,proxy_pass 5000
5,docker run -d -p 5000:5000 --name registry registry:2
開源企業級 VMware Harbor
docker的web管理界面admiral
docker run -d -p 8282:8282 --name admiral vmware/admiral