Linux - docker基礎

Linux - docker基礎

docker的概念

容器三大基本概念:python

  • 鏡像 image
  • 容器 container
  • 倉庫 repository

docker整個生命週期就是這三個概念。mysql

docker鏡像linux

Docker鏡像就是一個只讀的模板。

例如:一個鏡像能夠包含一個完整的CentOS操做系統環境,裏面僅安裝了Apache或用戶須要的其餘應用程序。

鏡像能夠用來建立Docker容器。

Docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。

docker容器git

image和container的關係,就像面向對象程序設計中的 類和實例同樣,鏡像是靜態的定義(class),容器是鏡像運行時的實體(object)。
容器能夠被建立、啓動、中止、刪除、暫停
Docker利用容器來運行應用。

容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的,保證安全的平臺。

能夠把容器看作是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。

注意:鏡像是隻讀的,容器在啓動的時候建立一層可寫層做爲最上層。

docker倉庫程序員

倉庫是集中存放鏡像文件的場所。有時候把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。

倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。

最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,能夠提供大陸用戶更穩定快讀的訪問。

當用戶建立了本身的鏡像以後就可使用push命令將它上傳到公有或者私有倉庫,這樣下載在另一臺機器上使用這個鏡像時候,只需須要從倉庫上pull下來就能夠了。

注意:Docker倉庫的概念跟Git相似,註冊服務器能夠理解爲GitHub這樣的託管服務。

docker安裝流程

1.安裝docker,因爲網速問題,選擇阿里雲的yum源下載github

yum install docker -y

2.啓動dockerweb

systemctl start docker

systemctl status docker   查看runing已經開啓

3。docker加速器,加速下載sql

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

會生成一個docker配置文件,路徑是/etc/docker/daemon.jsondocker

4.配置了加速器,須要重啓docker

systemctl restart docker

docker基本命令學習

#下載docker鏡像
docker pull hello-world
#運行docker鏡像,產生容器實例

#運行docker鏡像,ubuntu系統
docker run ubuntu  

#交互式的運行ubuntu 容器,進入容器空間內

docker run -it  ubuntu  /bin/bash 
    #參數解釋
    -i 交互式的命令操做
    -t 開啓一個終端提供訪問
    /bin/bash   指定shell解釋器
    
#打包構建一個攜帶vim的centos鏡像文件
    1.先運行一個centos基礎鏡像
    docker run -it centos /bin/bash 
    2.在容器空間內,安裝vim
    yum install vim -y 
    3.退出容器空間,提交這個容器,爲新的鏡像
    docker commit   1d5698b91178    yuchao163/s17centos-vim


​    
#導出本地的鏡像文件
docker save  0fc9d49cb739   > /opt/s17centos.tar.gz
    
#導入鏡像文件,    
docker load  <  /opt/s17centos.tar.gz

#刪除容器記錄

docker rm  容器id 

#批量刪除容器記錄
docker  rm `docker ps -aq`

#強制刪除全部容器記錄

docker rm -f  `docker ps -aq`

#刪除鏡像記錄

docker rmi  鏡像id 

#批量刪除鏡像文件
docker rmi `docker images -aq`

#修改docker鏡像名,tag標記名
docker tag  鏡像id   新的標記名

#運行過docker鏡像後,會產生容器記錄

#差看docker鏡像的命令

docker  image ls  
docker  images   #等同於上述命令,查看鏡像 


#查看正在運行的容器進程,
docker container ls  
docker ps 

#docker ps只能查看正在運行的容器
docker ps -a  查看全部的容器記錄 

#docker容器,必須有後臺程序在運行,不然容器就退出

#查詢docker鏡像記錄 

docker search centos

docker 的 hello docker

hello world是程序員啓蒙語言,咱們經過最簡單的image文件「hello-world」,來感覺一下docker。

#獲取鏡像 hello-world
docker pull hello-world
#檢查鏡像
docker images
#運行image文件,能夠用容器id
docker run hello-world
#檢查docker容器進程
docker ps
#檢查全部運行過的容器
docker ps -a

運行成功後,能夠看到結果:

運行一個ubuntu容器

docker search ubuntu #能夠看到用戶上傳的 ubuntu容器

  1. 下載ubuntu容器

    [root@oldboy_python ~ 11:52:22]#docker pull ubuntu:14.04
     #如圖,烏班圖的鏡像下載,是下載每一層的文件
     Trying to pull repository docker.io/library/ubuntu ... 
     14.04: Pulling from docker.io/library/ubuntu
     8284e13a281d: Pull complete 
     26e1916a9297: Pull complete 
     4102fc66d4ab: Pull complete 
     1cf2b01777b2: Pull complete 
     7f7a2d5e04ed: Pull complete 
     Digest: sha256:4851d1986c90c60f3b19009824c417c4a0426e9cf38ecfeb28598457cefe3f56
     Status: Downloaded newer image for docker.io/ubuntu:14.04
    
     下載過程能夠看出鏡像是由多層存儲構成的。下載也是一層一層,並不是單一的文件。
    
     下載過程當中給出每一層的前12位ID。下載結束後會給出sha246的文件一致性校驗值。
  2. 運行這個烏班圖容器

    [root@oldboy_python ~ 12:18:53]#docker run -it --rm ubuntu:14.04 bash
     #此時會進入交互式的shell界面,便可以使用烏班圖操做系統
     root@3efbb2749d7c:/# cat /etc/os-release  
     NAME="Ubuntu"
     VERSION="14.04.5 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.5 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
     #使用exit退出容器
     exit

docker run -it --rm ubuntu:14.04 bash

docker run就是運行容器的命令。
參數
 -it : -i 是交互式操做,-t是終端
 -rm  :   容器退出後將其刪除。也能夠不指定參數,手動docker rm,使用-rm能夠避免浪費空間。
 ubuntu:14.04   這指的是鏡像文件
 bash   :  指定用交互式的shell,所以須要bash命令

Docker與CentOS

docker容許在容器內運行應用程序,使用docker run命令來在容器內運行應用程序。

下載運行CentOS容器

加速docker鏡像下載

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io

下載centos鏡像

[root@oldboy_python ~ 15:14:31]#docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
256b176beaff: Pull complete
Digest: sha256:fc2476ccae2a5186313f2d1dadb4a969d6d2d4c6b23fa98b6c7b0a1faad67685
Status: Downloaded newer image for docker.io/centos:latest

運行一個交互式的容器

[root@oldboy_python ~ 15:15:07]#docker run -it centos /bin/bash
#此時進入docker容器
[root@c72e9c40cfe2 /]# cat /etc/redhat-release

此時就進入了centos系統

能夠查看系統相關信息,內核版本信息
cat /proc/version
ls /

此時想要退出容器,使用exit命令

提交修改自定義的鏡像(docker container commit)

1.咱們進入交互式的centos容器中,發現沒有vim命令
docker run -it centos
2.在當前容器中,安裝一個vim
yum install -y vim
3.安裝好vim以後,exit退出容器
exit
4.查看剛纔安裝好vim的容器記錄
docker container ls -a
5.提交這個容器,建立新的image
docker commit 059fdea031ba chaoyu/centos-vim
6.查看鏡像文件
[root@master /home]docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chaoyu/centos-vim   latest              fd2685ae25fe        5 minutes ago       348MB

外部訪問容器

容器中能夠運行網絡應用,可是要讓外部也能夠訪問這些應用,能夠經過-p或-P參數指定端口映射。

1. 宿主機會有一個端口狀態

    192.168.11.250:8000 

 容器空間也會有一個端口 
運行一個flask程序,開啓8000端口 

2. 容器內開啓一個容器,提供web程序

3. 下載一個python 網絡程序鏡像,運行它,生成一個容器進程


docker run -d training/webapp   -P  
    # -d 後臺運行容器
    # -P 隨機映射一個宿主機端口,到容器空間內,暴露的端口 
    # -p  指定端口映射 
    
docker run -d   -p 4567:5000      training/webapp    #指定宿主機的4567端口,映射到容器的5000端口

#進入到這個容器空間
docker exec -it 616  /bin/bash

利用dockerfile定製

鏡像是容器的基礎,每次執行docker run的時候都會指定哪一個鏡像做爲容器運行的基礎。咱們以前的例子都是使用來自docker hub的鏡像,直接使用這些鏡像只能知足必定的需求,當鏡像沒法知足咱們的需求時,就得自定製這些鏡像。

鏡像的定製就是定製每一層所添加的配置、文件。若是能夠吧每一層修改、安裝、構建、操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,所以每一條指令的內容,就是描述該層應當如何構建。

  1. 制定一個基礎基礎鏡像

    FROM scratch #製做base image 基礎鏡像,儘可能使用官方的image做爲base image
    FROM centos #使用base image
    FROM ubuntu:14.04 #帶有tag的base image

  2. 定義一個標籤,有問題去找他

    LABEL version=「1.0」 #容器元信息,幫助信息,Metadata,相似於代碼註釋
    LABEL maintainer=「yc_uuu@163.com"

  3. run指令是一個萬能指令

    #對於複雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!

    RUN yum update && yum install -y vim RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME」

    Python-dev #反斜線換行

  4. WORKDIR

    WORKDIR /root #至關於linux的cd命令,改變目錄,儘可能使用絕對路徑!!!不要用RUN cd
     WORKDIR /test #若是沒有就自動建立
     WORKDIR demo #再進入demo文件夾
  5. ADD和COPY

    ADD and COPY 
     ADD hello /  #把本地文件添加到鏡像中,吧本地的hello可執行文件拷貝到鏡像的/目錄
     ADD test.tar.gz   /tmp    #添加到根目錄並解壓
    
     優先使用COPY命令
     ADD除了COPY功能還有解壓功能
     添加遠程文件/目錄使用curl或wgetse
  6. ENV設置環境變量

    ENV MYSQL_VERSION 5.6 #設置一個mysql常量
     下面引用的時候 都是 MYSQL_VERSION 5.6
    
     ENV MYSQL_VERSION 6.7
     RUN yum install -y mysql-server=「${MYSQL_VERSION}」 
     RUN yum install -y mysql-server=「${MYSQL_VERSION}」 
     RUN yum install -y mysql-server=「${MYSQL_VERSION}」 
     RUN yum install -y mysql-server=「${MYSQL_VERSION}」 
     RUN yum install -y mysql-server=「${MYSQL_VERSION}」

打包flask程序與dockerfile

確保app.py和dockerfile在同一個目錄!

1.準備好app.py的flask程序

[root@master home]# cat app.py
#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return "hello docker"
if __name__=="__main__":
    app.run(host='0.0.0.0',port=8080)
[root@master home]# ls
app.py  Dockerfile

2.編寫dockerfile

FROM centos
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/ 
RUN yum clean all 
RUN yum install python-setuptools -y
RUN easy_install flask
COPY s16-flask.py /opt/
WORKDIR /opt
EXPOSE 8080
CMD ["python","s16-flask.py"]

3.構建鏡像image

docker build -t yuchao163/flask-hello-docker .

4.查看建立好的images

docker image ls

5.啓動此flask-hello-docker容器,映射一個端口供外部訪問

docker run -d -p 8080:8080 yuchao163/flask-hello-docker

6.檢查運行的容器

docker container ls

發佈 docker image 到倉庫

發佈到公有鏡像

1.docker提供了一個相似於github的倉庫dockerhub,
網址https://hub.docker.com/須要註冊使用
2.註冊docker id後,在linux中登陸dockerhub
docker login

注意要保證image的tag是帳戶名,若是鏡像名字不對,須要改一下tag
docker tag chaoyu/centos-vim yuchao163/centos-vim
語法是:  docker tag   倉庫名   yuchao163/倉庫名


3.推送docker image到dockerhub
docker push yuchao163/centps-cmd-exec:latest
4.在dockerhub中檢查鏡像
https://hub.docker.com/
5.刪除本地鏡像,測試下載pull 鏡像文件
docker pull yuchao163/centos-entrypoint-exec

私有倉庫

可是這種鏡像倉庫是公開的,其餘人也是能夠下載,並不安全,所以還可使用docker registry官方提供的私有倉庫

1.官方提供的私有倉庫docker registry用法
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
2.一條命令下載registry鏡像而且啓動私有倉庫容器
私有倉庫會被建立在容器的/var/lib/registry下,所以經過-v參數將鏡像文件存儲到本地的/opt/data/registry下
端口映射容器中的5000端口到宿主機的5000端口
docker run -d \
    -p 5000:5000 \
    -v /opt/data/registry:/var/lib/registry \
    registry
3.檢查啓動的registry容器
docker ps
4.測試鏈接容器
telnet 192.168.119.10 5000
5.修改鏡像tag,以docker registry的地址端口開頭
docker tag hello-world:latest 192.168.119.10:5000/hello-world:latest
6.查看docker鏡像,找到registry的鏡像
docker images
7.Docker 默認不容許非 HTTPS 方式推送鏡像。咱們能夠經過 Docker 的配置選項來取消這個限制,這裏必須寫正確json數據
[root@master /]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://95822026.m.daocloud.io"],
"insecure-registries":["192.168.119.10:5000"]
}

寫入到docker服務中,寫入到[Service]配置塊中,加載此配置文件
[root@master home]# grep 'EnvironmentFile=/etc/docker/daemon.json' /lib/systemd/system/docker.service
EnvironmentFile=-/etc/docker/daemon.json
8.修改了docker配置文件,從新加載docker
systemctl daemon-reload
9.重啓docker
systemctl restart docker
10.重啓了docker,剛纔的registry容器進程掛掉了,所以從新啓動它
docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
--privileged=true  docker容器的安全機制:設置特權級運行的容器
11.推送本地鏡像
docker push 192.168.119.10:5000/hello-world

12.因爲docker registry沒有web節目,可是提供了API數據
官網教程:https://docs.docker.com/registry/spec/api/#listing-repositories

curl http://192.168.119.10:5000/v2/_catalog

或者瀏覽器訪問http://192.168.119.10:5000/v2/_catalog
13.刪除本地鏡像,從私有倉庫中下載
docker pull 192.168.119.10:5000/hello-world
相關文章
相關標籤/搜索