Dockerhtml
docker說白了就是:環境打包python
咱們能用docker什麼?mysql
1.若是配置好本地的linux環境交接給其餘人,很麻煩,交接時要告訴他,裝這個裝那個,還可能出現問題,那我直接把這個環境放到docker中打包成鏡像給他,原來的環境怎麼樣的仍是怎麼樣,咱們不能去糾結配置環境的問題,而留下更多的時間來解決其餘問題linux
2.虛擬化技術,不少就用了docker把一些已經裝好的資源分配給雲用戶,讓用戶購買他們的服務等nginx
幫助文檔 web
文檔:http://www.dockerinfo.net/documentredis
docker三大要素sql
鏡像:模板(相似於'類')docker
容器:鏡像的實例(相似於'對象')shell
倉庫:存放鏡像文件的地方,可能在雲,可能在註冊服務器上,最大的公開倉庫是docker hub,國內阿里雲就夠用了
docker自己是一個容器運行載體,咱們把咱們要的配置程序和依賴包造成一個能夠交付的運行環境,把這個環境打包成爲一個image鏡像文件,只有經過這個鏡像文件才能生成docker容器,image文件能夠看作容器的模板,docker根據image文件生成容器的實例,同一個image文件,能夠生成多個同時運行的容器實例
目前docker要求centos7環境達到64位,系統內核版本3.10以上
cat /etc/redhat-release #查看linux內核版本 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 #移除以前版本 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #安裝一些必要的系統工具 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #添加軟件源信息 sudo yum makecache fast #更新 yum 緩存 sudo yum -y install docker-ce #安裝 Docker-ce sudo systemctl start docker #啓動 Docker 後臺服務
docker version
#查看docker版本
docker的基本使用:
建立一個容器並執行命令
docker pull ubuntu:15.10 #拉取官方的烏版圖
docker run ubuntu:15.10 /bin/echo "Hello world" #docker執行docker的二進制文件 #run 結合docker一塊兒使用,表示運行一個容器 #ubuntu:15.10指定要運行的鏡像,Docker首先從本地主機上查找鏡像是否存在,若是不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像 #/bin/echo "Hello world": 在啓動的容器裏執行的命令
運行交互式容器命令
docker run -i -t ubuntu:15.10 /bin/bash
#-i -t -t:在新容器內指定一個僞終端或終端。 -i:容許你對容器內的標準輸入 (STDIN) 進行交互。
運行exit命令或者使用CTRL+D
啓動容器(後臺模式)
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" #返回bf8e12e0315d51a7fb8ee2cc2b788f13b1a651aadbb9194e6ff74825fade3d0a,這個長字符串叫作容器ID,由64位組成,對每一個容器來講都是惟一的,咱們能夠經過容器ID來查看對應的容器發生了什麼
docker ps ↓
CONTAINER ID:容器ID NAMES:自動分配的容器名稱
docker logs CONTAINER_ID /或者 NAME 命令,查看容器內的標準輸出
docker logs amazing_cori
docker logs -f amazing_cori #,-f參數能夠像tail -f xxx.log同樣輸出
docker logs tail 3 amazing_cori #查看倒數三行並持續輸出
docker幫助命令
docker ps --help 查看docker ps的幫助
docker info #查看主機我的信息
查看容器
docker ps -a #查看全部容器 docker ps -l #查看最後一次建立的容器 docker ps #查看正在使用的容器 docker ps -s #查看正在使用的容器,增長參數容器大小
中止容器
docker stop amazing_cori
啓動容器
docker start amazing_cori
運行容器實例
docker pull training/webapp #載入鏡像,載入步驟,docker先回去local本地找你輸入的鏡像名稱,若是沒有則去你設置的鏡像倉庫pull拉去 docker run -d -P training/webapp python app.py #-d 後臺運行 -P將容器內部使用的網絡端口映射到咱們使用的主機上
運行127.0.0.1:32768顯示hello world!
查看dockor端口
dockor port 容器名 #或者能夠加端口號docker port 容器名 5000
查看應用程序配置信息
docker inspect 9ac #查看 Docker 的底層信息。它會返回一個 JSON 文件記錄着 Docker 容器的配置和狀態信息
建立容器
#該命令與run命令同樣,但惟一區別是隻是建立,不啓動
docker create [OPTIONS] IMAGE [COMMAND] [ARG...] docker create --name myrunoob nginx:1.3
kill命令
docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker kill -s KILL nginx #殺掉nginx -s爲向容器發送的信號
top命令
docker top 容器名稱 #返回容器中的ps -ef 操做
移除容器
刪除容器時,容器必須是中止狀態,不然會報錯,除非加-f
docker rm xxx
docker rm -f xxx #強制刪除
docker rm -f xxx01 xxx02 #刪除多個
docker rm -f $(docker images -qa) #刪除全部容器
pause/unpause命令
docker pause :暫停容器中全部的進程。
docker unpause :恢復容器中全部的進程。
docker的鏡像
當運行容器時,使用的鏡像若是在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載
列出本機docker的全部鏡像源
[root@rainbol ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 6 months ago 1.84kB ubuntu 15.10 9b9cb95443b5 3 years ago 137MB training/webapp latest 6fae60ef3446 4 years ago 349MB
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標籤,指定不一樣的鏡像標籤對應不一樣的倉庫源版本,若是在docker run時不指定鏡像倉庫源的版本,默認latest最後版本
IMAGE ID:鏡像ID
CREATED:鏡像建立時間
SIZE:鏡像大小
docker images -a #列出本地全部鏡像,含中間鏡像層
-q #只顯示當前鏡像的IMAGE ID
-qa #列出本機全部鏡像的IMAGE iD 能夠作批處理操做,如刪除
獲取下載鏡像 下載完成後就可使用了
docker pull ubuntu:13.10
docker pull tomcat:7
查看鏡像源
docker search httpd
docker search -s 1000 httpd #查看點贊數超過1000的httpd源
刪除鏡像
docker rm images [images id]
docker rmi [images id] #rm images 和 rmi 是同樣的
docker rmi -f [images id] #強制刪除
docker鏡像原理
docker鏡像基於聯合文件系統組成,一層套一層的結構,好比咱們要下載tomcat,原理是不一樣發行版本共用linux內核(rootfs).這是底層,以後下載精簡版centos->以後下載jdk->最後才下載tomcat,因此說這一層一層的結構組成了tomcat,鏡像刪除後會留在主機緩存,第二次安裝會比第一次快
端口映射
docker run -d -p 5000:5000 training/webapp python app.py -p : 是容器內部端口綁定到指定的主機端口。左5000是實際服務器端口,右5000是容器5000端口 docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py 也能夠指定ip docker run -d -P training/webapp python app.py -P 是容器內部端口隨機映射到主機的高端口 默認都是綁定 tcp 端口,若是要綁定 UDP 端口,能夠在端口後面加上 /udp
如何進入一個已經建立了的容器
進入Docker容器比較常見的幾種作法以下:
1.首次建立進入容器時,讓/bin/bash可用
docker run -i -t -d ubuntu:15.10 /bin/bash #-d表示後臺運行/bin/bash
docker attach xxx #進入容器,xxx爲容器id,直接進入容器啓動命令的終端,不會啓動新的進程
當多個窗口同時使用該命令進入該容器時,全部的窗口都會同步顯示。若是有一個窗口阻塞了,那麼其餘窗口也沒法再進行操做
2.使用SSH進入Docker容器(不推薦)
3.nsenter進入容器
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz $ tar -xzvf util-linux-2.24.tar.gz $ cd util-linux-2.24/ $ ./configure --without-ncurses $ make nsenter $ sudo cp nsenter /usr/local/bin
docker ps
sudo docker inspect -f {{.State.Pid}} xxx #xxx爲容器id拿到PID爲1234
sudo nsenter --target 1234 --mount --uts --ipc --net --pid #把PID爲1234放進入就就能夠進入容器了
4. exec命令 在容器中打開命令的終端,不會啓動新的進程
docker ps #拿到容器id爲xxxxx docker exec -it xxxxx /bin/bash #-it的意義就是開啓交互終端的意思
docker exec -it xxxxx ls #執行或者查看結果指令,會返回給咱們,可是不會進入容器內
退出容器
exit
docker安裝nginx
#nginx的簡單部署
docker pull nginx #安裝nginx源
docker run --name nginx_test -P -d nginx #建立並運行nginx
nginx自定義部署 mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf #首先在目錄創建nginx目錄 docker run -d -p 8082:80 --name runoob-nginx-test-web -v ~/nginx/www:/usr/share/nginx/html -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/logs:/var/log/nginx nginx
#-v爲建立掛載,將本地的文件加載到容器中,需指定位置
文件下載與下載
docker cp 容器id:容器文件路徑 宿主機路徑 #從容器中下載到主機
dockor cp 宿主機路徑 容器id:容器路徑 #主機上傳到容器
docker鏡像加速
咱們常常發現鏈接國外的鏡像下載很慢,那就使用國內廠商的鏡像加速,這裏推薦阿里雲鏡像加速器,登錄阿里雲帳號後搜索容器鏡像服務->鏡像加速器->centos->到本機中如linux $vi /etc/docker/daemon.json (若是沒有的話就新建,默認就是沒有的) -> 添加 { "registry-mirrors": ["https://cz6ionug.mirror.aliyuncs.com"] } 這個字典後保存->重啓
sudo systemctl daemon-reload sudo systemctl restart docker
docker查看容器中的進程
docker top PID
docker commit/pull使用
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] -a :提交的做者 -c :使用dockerfile指令來建立鏡像 -m:提交時的文字說明 -p :在commit時,將容器暫停 docker commit -a "rainbol" -m "提交了" 65asd2a mydocker:v1 #提交到本地 docker push [OPTIONS] NAME[:TAG] options:--disable-content-trust :忽略鏡像的校驗,默認開啓 docker push rainbol/mydocker:v1 #提交到dockerhub,須要登陸帳號
docker數據卷
容器與主機數據共通,實現持久化和數據共享
docker run -it -v /主機絕對路徑:/容器絕對路徑 鏡像名 #創建數據掛載連接 -v:開啓卷 docker inspect sad213d 找到 volumes生成了一個字典而且hostconfig:binds中生成字典說明連接成功了 此時主機和容器內這兩個文件夾裏面的數據資源共享共存,容器重啓後數據同步 docker run -it -v /主機絕對路徑:/容器絕對路徑:ro 鏡像名 #ro(read only只讀) 只容許主機單向的操做,容器只能進行讀操做 在docker inspect sad213d命令中volumesRw會變成false
沒有指定宿主機docker默認會添加一個路徑文件,可在inspect命令中查看
dockerfile形式添加數據卷
因爲docker不支持docker run -it -v /主機絕對路徑1:/容器絕對路徑1 -v /主機絕對路徑2:/容器絕對路徑2 存在遷移性
引入dockerfile,創建更多的容器卷
docker數據卷容器
說白了就是主容器與副容器的掛載連接,實現資源共享
docker run -it --name test1 tomcat #創建主容器 docker run -it --name test2 --volumes-from test1 tomcat # --volumes-from 被繼承容器名,test2繼承test1的全部,以後主容器和副容器的數據卷同步共享
容器之間配置信息的傳遞,數據卷的生命週期一直持續到其沒有容器使用爲止,也就說在無限被繼承中,不管哪一個容器掛了,其資源共享,配置信息依舊存在
1.構建可執行的shell腳本
FROM tomcat VOLUME ["/data01","/data02"] CMD echo "finished,----success" CMD /bin/bash
2.build生成鏡像
docker build -f /dockerfile文件絕對路徑 -t rainbol/mytomcat /存放目錄 #-f指定dockerfile路徑 -t命名空間/鏡像名稱
#若是build的dockerfile文件在當前目錄能夠不用寫'-f dockerfile文件路徑'
dockerfile的使用
dockerfile就是用來構建docker鏡像的構建文件,說白了就是個執行參數和命令的腳本而已
dockerfile文件規則:1.保留字指令必須大寫,後面至少一個參數
2.命令從上到下執行
3.#表示註釋
4.每條指令都會建立一個新的鏡像層,並對鏡像進行提交(如FROM centos,加第一層進行,若是要再加其餘的,就再加,這就是層層累加)
#第一條指令必須爲 指令。而且,若是在同一個Dockerfile中建立多個鏡像時,可使用多個 指令(每一個鏡像一次)
FROM <images>
FROMFROM
FROM <image>:<tag>
FROM centos
FROM scratch #基礎鏡像->祖先源鏡像
維護者信息(名字和郵箱)
容器運行時須要的額外命令
RUN <command> RUN chmod -R 777 tomcat-7 RUN ["executable", "param1", "param2"] #使用 exec 執行。指定使用其它終端能夠經過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]
RUN ["/bin/bash", "-c", "echo hello"]
EXPOSE <port> [<port>...] EXPOSE 8080 #告訴 Docker 服務端容器暴露的端口號
WORKDIR /usr/local #在建立後終端登陸到容器後默認進入的工做目錄
ENV <key> <value> #設置環境變量 ENV MY_TEST /usr/local WORKDIR $MY_TEST
格式爲 COPY <src> <dest>。 複製本地主機的 <src>(爲 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。 當使用本地目錄爲源目錄時,推薦使用 COPY。
格式爲 ADD <src> <dest>。 該命令將複製指定的 <src> 到容器中的 <dest>。 其中 <src> 能夠是Dockerfile所在目錄的一個相對路徑;也能夠是一個 URL;還能夠是一個 tar 文件(自動解壓爲目錄)。 說白了add = copy + 自解壓
支持三種格式 CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式; CMD command param1 param2 在 /bin/sh 中執行,提供給須要交互的應用; CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數; 指定啓動容器時執行的命令,每一個 Dockerfile 只能有一條 CMD 命令。若是指定了多條命令,只有最後一條會被執行。 若是用戶啓動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。
兩種格式: ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2(shell中執行)。 配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋。
每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
說白了cmd是多個會被覆蓋,而entrypoint多個會追加
ONBUILD [INSTRUCTION] ONBUILD RUN echo '我被繼承了--------ok' ONBUILD ADD a.txt /usr/local
配置當所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令
案例1:
重構centos鏡像寫一個dockerfile,初始路徑爲/usr/local,安裝ifconfig,vim指令
#/mydocker/dockerfile
FROM centos
MAINTAINER rainbol<xxx.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y vim RUN yum -y net-tools EXPOSE 80 CMD /bin/bash
進入mydocker目錄,運行
docker build -t rainbol/mycentos . #構建鏡像
docker run -it rainbol/mycentos /bin/bash #運行
docker history ID # 查看docker歷史構建信息,下圖能夠看到咱們剛剛構建的信息
案例2:
重構centos鏡像寫一個dockerfile,初始路徑爲/usr/local,功能能訪問ip.cn返回當前ip地址
#/mydocker/dockerfile2 FROM centos MAINTAINER rainbol<xxx.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install curl ENTRYPOINT ["curl","-s","https://ip.cn"] #注意這裏參數不能爲單引號,不然會報錯 EXPOSE 80 CMD /bin/bash
docker build -f /mydocker/dockerfile2 -t rainbol/mycentos:1.1 .
docker run rainbol/mycentos:1.1 -i
#-i爲curl請求頭的參數,此時會在ENTRYPOINT追加參數
案例3:
#/mydocker/dockerfile_test01 FROM centos MAINTAINER rainbol<xxx.com> ENV MYPATH /usr/local WORKDIR $MYPATH ONBUILD RUN echo '我竟然被繼承了' EXPOSE 80
先構建上面dockerfile爲test01
#/mydocker/dockerfile_test02 FROM test01 MAINTAINER rainbol<xxx.com> ENV MYPATH /usr/local WORKDIR $MYPATH EXPOSE 80
當構建上面mydockerfile時返回,能夠看到執行了ONBUILD中的命令
案例4 自建tomcat服務器
1.在指定路徑下存放tomcat.tar包和jdk,dockerfile文件,c.txt自建文檔
2. 編寫dockerfile腳本
#以前下載了centos,因此這裏執行它
FROM centos
#命名做者 MAINTAINER rainbol<xxx@qq.com>
#拷貝c.txt到容器中重命名一個文檔(爲了測試,意義不是很大) COPY c.txt /usr/local/cincontainer.txt
#將jdk複製到容器指定位置,注意ADD指令能夠自動解壓縮 ADD openjdk-9.0.4_linux-x64_bin.tar.gz /usr/local/
#將tomcat複製到容器指定位置 ADD apache-tomcat-9.0.12.tar.gz /usr/local/
#下載vim RUN yum -y install vim
#設置默認進入路徑 ENV MYPATH /usr/local WORKDIR $MYPATH
#設置環境變量 ENV JAVA_HOME /usr/local/jdk-9.0.4 ENV CATAINA_HOME /usr/local/apache-tomcat-9.0.12 ENV CATAINA_BASE /usr/local/apache-tomcat-9.0.12 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATAINA_HOME/bin #設置tomcat容器對外端口
EXPOSE 8080 #執行啓動和查看打印日誌命令
CMD /usr/local/apache-tomcat-9.0.12/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.12/logs/catalina.out
3.build構建鏡像
docker build -f /mydocker/dockerfile_test01 -t test01 .
4.啓動鏡像
docker run -d -p 9876:8080 --name newmt9 -v /mydocker/rainbol/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.12/webapps/test -v /mydocker/rainbol/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.12/logs --privileged=true mt9 #兩個-v表示添加兩個容器與主機掛載,一個是放應用或服務,一個是存放日誌 #--privileged=true 有可能會出現權限不足,那加這個
5.測試 docker ps
有頁面返回說明啓動成功
安裝mysql:
docker pull mysql:5.6 #選擇相對穩定的5.6版本
docker run -p 12345:3306 --name mysql -v / docker run --name mysql56 -p 12345:3306 -v /mydocker/rainbol/mydockerfile/mysql5.6/conf:/etc/mysql/conf.d -v /mydocker/rainbol/mydockerfile/mysql5.6/logs:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 docker exec -it mysql56 /bin/bash
安裝jenkins
https://www.jianshu.com/p/12c9a9654f83
安裝redis:
docker pull redis:3.2
docker run -p 2345:6379 -v /mydocker/rainbol/mydockerfile/redis3.2/data:/data -v /mydocker/rainbol/mydockerfile/redis3.2/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes docker exec -it 0caf0428 redis-cli #鏈接容器內的redis客戶端
發佈
本地的鏡像發佈到阿里雲上
1.鏡像生成 [root@rainbol redis3.2]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dc2e60009bcb mt9 "/bin/sh -c '/usr/lo…" 12 hours ago Up 12 hours 0.0.0.0:9876->8080/tcp newmt9 [root@rainbol redis3.2]# docker commit -a rainbol -m 'newtomcat' dc2e60009bcb newtomcat1.2 [root@rainbol redis3.2]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE newtomcat1.2 latest 15ce08832084 4 minutes ago 728MB
https://cr.console.aliyun.com進入阿里雲鏡像服務,建立完倉庫
第二行的鏡像版本號是爲你想傳到阿里雲倉庫的版本號
第三行的鏡像版本號和第二行你剛剛填的鏡像版本號保持一致
第三步推送時間比較長要等好久
拉取阿里雲的鏡像
私人:複製地址 docker pull 倉庫地址:版本號 #注意可能出現多個版本,加版本號選擇你想要的版本
公開: 在鏡像中心的鏡像搜索進行下載鏡像 docker pull 倉庫地址:版本號 #注意可能出現多個版本,帶版本號選擇你想要的版本
docker鏡像打包 若是不存在雲倉庫,由於雲上上傳和下載很慢,或者是公司沒網,怎麼辦呢,可使用鏡像打包的方法
docker save
docker save [OPTIONS] IMAGE [IMAGE...] docker save -o 要保存的文件名 要保存的鏡像id docker save -o /usr/local/nginx.tar jda090d1
docker load
docker load [OPTIONS] -i :指定導出的文件。 -q :精簡輸出信息。 docker load < /usr/local/nginx.tar docker load -i /usr/local/nginx.tar -q
版權聲明:本文原創發表於 博客園,做者爲 RainBol 本文歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。