docker是什么(將代碼、配置環境全部打包在一個鏡像文件中,鏡像就是操作系統的壓縮文件)
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目, 於 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護。 Docker 使用 Google 公司推出的 Go 語言 進行開發實現。 docker是linux容器的一種封裝,提供簡單易用的容器使用接口。它是最流行的Linux容器解決方案。 docker的接口相當簡單,用戶可以方便的創建、銷毀容器。 docker將應用程序與程序的依賴,打包在一個文件里面。運行這個文件就會生成一個虛擬容器。 程序運行在虛擬容器里,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了。
為什么要用docker
# 因為以前服務器部署應用的時候最開始用物理機,后來用虛擬機, 1.會很浪費時間 2.成本非常高 3.資源浪費 4.難於遷移和擴展,換機器需要把所有依賴關系都安裝一遍 5.可能會別限定硬件廠商,比如在聯想電腦上寫的,在戴爾電腦就不能用 !!! docker的出現解決了這些問題,並且還解決了最讓人頭疼的環境配置問題,他可以把所有需要的環境,依賴包放到一個容器里,然后打包發給測試
物理機,虛擬機,docker的區別
物理機, 虛擬機, docker的關系就好比 物理機是一棟居民樓, 虛擬機是居民樓里的每個房子,docker就相當於房子里面的每個房間.
docker VS 傳統虛擬機

docker的三大概念
# docker 三大基本概念 容器 container 相當於類實例化的對象 電腦城的光盤
鏡像 image 相當於那個類 刻光盤的機器 倉庫 repository 管理鏡像的 電腦城
docker整個生命周期就是這三個概念。
鏡像(操作系統的一個壓縮文件)
Docker鏡像就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的CentOS操作系統環境,里面僅安裝了Apache或用戶需要的其他應用程序。
鏡像可以用來創建Docker容器。
Docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
容器
image和container的關系,就像面向對象程序設計中的 類和實例一樣,鏡像是靜態的定義(class),容器是鏡像運行時的實體(object)。 容器可以被創建、啟動、停止、刪除、暫停 Docker利用容器來運行應用。 容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平台。 可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。 !!! 注意:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。
倉庫
倉庫是集中存放鏡像文件的場所。有時候把倉庫和倉庫注冊服務器(Registry)混為一談,並不嚴格區分。
實際上,倉庫注冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,可以提供大陸用戶更穩定快讀的訪問。
當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下載在另外一台機器上使用這個鏡像時候,
只需需要從倉庫上pull下來就可以了。
!!! 注意:Docker倉庫的概念跟Git類似,注冊服務器可以理解為GitHub這樣的托管服務。
centos安裝docker
官方安裝 1.卸載舊版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 2.設置存儲庫 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安裝docker社區版 yum install docker-ce 4.啟動關閉docker systemctl start/status docker
配置docker容器加速器,加速鏡像文件的下載
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io !!! 注意:一定要修改docker的配置文件才能生效, vim /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"]} #去掉結尾的逗號
docker命令
docker啟動停止容器
#啟停docker容器 docker start 容器id docket stop 容器id #批量停止docker容器 docker stop `docker ps -aq`
驗證當前是那個系統 : cat /etc/os-release
docker stop 鏡像id 關閉鏡像
sudo systemctl stop docker 關閉整個docker程序
對docker容器,鏡像的增刪改查
增
#獲取一個hello-world鏡像,默認去docker Hub中搜索docker鏡像
docker search hello-world #搜索鏡像
docker pull hello-world #下載鏡像,如同我去買光盤
#基於鏡像運行一個容器實例
docker run hello-world #也可以docker run 鏡像文件ID的前三位,同樣可以執行
#交互式運行一個ubuntu系統,就是可以輸入命令
docker run -it ubuntu /bin/bash
參數解釋:
-i 交互式運行
-t 開啟一個終端
/bin/bash linux的shell解釋器
提交記錄,生成新的鏡像文件
docker commit 鏡像id 鏡像名
#運行一個活着的容器,后台有進程的容器
#運行一個后台有進程的容器,活着的容器
docker run -d centos /bin/sh -c "while true;do echo 買了佛冷; sleep 1;done"
#參數解釋
docker run 運行鏡像
-d daemonize 后台運行
centos 鏡像名
/bin/sh 指定shell的sh解釋器
-c 指定一段shell代碼
"while true;do echo 買了佛冷; sleep 1;done" #死循環的每秒鍾打印一個買了佛冷
#運行一個自定義名字的容器記錄
docker run --name s18foleng -d centos /bin/sh -c "while true;do echo 買了佛冷; sleep 1;done"
#導出docker鏡像
docker save 9ed836d5dd03 > /opt/mydocker.tar.gz
#導入docker鏡像
docker load < /opt/mydocker.tar.gz
#docker run 如果運行不存在的鏡像,默認會去先docker pull
#容器內指定端口映射,暴露宿主機的7000,指定映射到容器的5000,這個5000是在容器代碼內控制的
docker run -d -p 7000:5000 training/webapp python app.py
參數解釋:
-d 后台運行容器
-p 大P,隨機端口映射,小p,指定端口映射
training/webapp 鏡像名字
python app.py 容器要執行的命令
0~65535 端口范圍
刪
#刪除容器有關
docker rm "容器id" #刪除容器記錄,后面跟的是容器id的前三位
docker re ~docker ps -ap~ #一次性刪除所有容器記錄 # 反引號取得的是命令的結果
docker rm ~docker rmi -ap~ #一次性刪除所有鏡像 ,-f 強制刪除,盡量少用
#刪除鏡像有關
docker rmi "鏡像id" #刪除鏡像,
改
#進入正在運行的容器空間內
docker exec -it 容器id /bin/bash
#修改docker鏡像的名字
docker tag 鏡像id 新的鏡像名
docker tag 9ed836d5dd03 yuchao163/s18-aliyun-centos-vim
查
docker image ls #列出docker鏡像文件
docker images #同上,
#運行鏡像后,會產生一個容器記錄,
docker ps #查看當前正在運行的容器記錄,容器必須有存在的意義,否則會掛掉
docker ps -a #查看所有運行過的容器記錄
docker ps -ap #查詢出所有運行過容器記錄的id
docker images -ap #查詢出所有鏡像id
#查看容器內日志信息
docker logs 容器id #一次性打印日志
docker logs -f 容器id #不間斷打印日志
實例:構建自己的docker鏡像,提交到本地鏡像倉庫
1.運行一個centos基礎鏡像,發現沒有vim,在容器內部安裝vim,且配置阿里源 docker run -it centos /bin/bash 2.安裝wget,下載阿里雲的yum源 yum install -y wget wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 3.基於阿里雲的yum源下載vim yum install -y yum 4.退出centos容器環境 exit 5.提交這個容器記錄,生成一個新的鏡像文件 docker commit 鏡像id 鏡像名
導出這個鏡像,成為一個壓縮文件,就可以給大家發送下去
#登錄dockerhub個人主站,托管docker鏡像的網址
https://hub.docker.com/
1.下載dockerhub上的鏡像
docker pull superme/s18-hello-docker-world
2.在linux登錄docker hub,然后推送鏡像到公網
docker login
3.修改本地鏡像的名字,為docker hub的倉庫id
docker tag 鏡像id dockerhubID/鏡像名
4.推送鏡像到docker hub
docker push 鏡像id
dockerfile的學習
什么是dockerfile?
dockerfile其實就是之前我們都是手動的執行命令,而dockerfile是在這個文件中制定了相對應的代碼,自動的執行命令。
其實就是一個存儲代碼的地方,告訴系統我們要怎么樣執行這段代碼?
dockerfile中的指令
#項目依賴於什么操作系統 FROM scratch #制作base image 基礎鏡像,盡量使用官方的image作為base image FROM centos #使用base image FROM ubuntu:14.04 #帶有tag的base image #label標簽,誰寫的,以及幫助信息 LABEL version=“1.0” #容器元信息,幫助信息,Metadata,類似於代碼注釋 LABEL maintainer=“superme@163.com" #run指令,是一個萬能指令 #對於復雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令! RUN yum update && yum install -y vim \ Python-dev #反斜線換行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME” #workdir 相當於linux中的 cd,切換目錄 WORKDIR /etc WORKDIR root #add 把本地的代碼添加到容器中,還可以用來解壓縮文件 ADD shuai.txt /opt #把本地的shuai.txt添加到鏡像中的/opt下 ADD shuai.tar.gz /opt #解壓縮之后添加到鏡像中的/opt下 #copy 將宿主機的文件,拷貝到容器中,不會解壓縮文件 COPY hello test/ #等同於上述ADD效果 ADD與COPY - 優先使用COPY命令 -ADD除了COPY功能還有解壓功能
#ENV 相當於定義了一個變量,定義了之后,提高代碼的可維護性
#比如,我寫了很多個 d=1,有一天我要把這個d改為2的時候,我是不是要把每一個都給改了呀,使用了ENV就可以避免這個問題
ENV MYSQL_VERSION 1.6
RUN yum install -y mysql-server = "${MYSQL_VERSION}"
dockerfile實戰,構建自己的flask鏡像
准備工作:
創建's18'目錄,在目錄中創建s18-flask.py 和Dockerfile文件(后者名稱是固定不能改變的)
1.准備一個flask代碼文件 cat s18-flask.py 2.編寫dockerfile FROM centos #指定centos基礎鏡像 COPY CentOS-Base.repo /etc/yum.repos.d/ #拷貝宿主機的文件,到容器空間下 COPY epel.repo /etc/yum.repos.d/ #拷貝宿主機的文件,到容器空間下 RUN yum clean all #執行清空yum緩存的命令 RUN yum install python-setuptools -y #想安裝python依賴工具 RUN easy_install flask #是想讓docker自動的幫咱們安裝python2的flask模塊 COPY flask.py /opt/ #把本地的代碼文件,拷貝到容器的/opt目錄下 WORKDIR /opt #進入到/opt目錄下 EXPOSE 8080 #暴露容器的8080端口,供給外部宿主機去訪問 CMD ["python","flask.py"] #cmd代表你要執行的命令 3.構建build這個dockerfile 確保文件都准備好了,如下所示 [root@wangdachui s18dockerfile]# ls CentOS-Base.repo Dockerfile epel.repo s18-flask.py 4.構建dockerfile docker build . 5.通過自己構建的鏡像,運行一個flask程序 docker run -d --name flask -p 5555:8080 s18-flask.py 參數:
--name 表示這個程序執行的是什么
6.通過瀏覽器去訪問linux宿主機的 5555端口,即可訪問到flask程序
搭建docker私有倉庫
1.下載docker私有鏡像 docker pull registry 2.修改docker的配置文件 #修改如下配置文件 vim /etc/docker/daemon.json 修改內容如下 {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.226.128:5000"] } 3.修改docker的service配置文件,讓它加載/etc/docker/daemon.json 修改如下文件 vim /lib/systemd/system/docker.service 添加如下配置到 [service]代碼塊中 EnvironmentFile=-/etc/docker/daemon.json 4.重啟docker的服務 systemctl daemon-reload systemctl restart docker 5.重新啟動一個私有鏡像倉庫的容器實例 docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全機制:設置特權級運行的容器 6.推送本地鏡像,到私有倉庫中 docker push 192.168.226.128:5000/s18-hello-world 7.檢查docker私有倉庫的api地址,檢查json數據 http://192.168.226.128:5000/v2/_catalog 8.嘗試下載私有倉庫的鏡像 docker pull 192.168.226.128:5000/s18-hello-world
