docker容器技術

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

相關文章
相關標籤/搜索