Docker初識筆記

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文件,能夠生成多個同時運行的容器實例

 

安裝:使用 yum 安裝(CentOS 7下)

  目前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容器比較常見的幾種作法以下:

  • 使用docker attach
  • 使用SSH
  • 使用nsenter
  • 使用exec

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,加第一層進行,若是要再加其餘的,就再加,這就是層層累加)

  FROM

#第一條指令必須爲  指令。而且,若是在同一個Dockerfile中建立多個鏡像時,可使用多個  指令(每一個鏡像一次)

FROM <images>
FROMFROM
FROM <image>:<tag>  
FROM centos 
FROM scratch
#基礎鏡像->祖先源鏡像

  MAINTAINER

    維護者信息(名字和郵箱)

  RUN

    容器運行時須要的額外命令

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 

EXPOSE <port> [<port>...]
EXPOSE 8080 #告訴 Docker 服務端容器暴露的端口號

  WORKDIR

WORKDIR /usr/local    #在建立後終端登陸到容器後默認進入的工做目錄

  ENV

ENV <key> <value>    #設置環境變量
ENV MY_TEST /usr/local
WORKDIR $MY_TEST

  COPY

格式爲 COPY <src> <dest>。
複製本地主機的 <src>(爲 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。
當使用本地目錄爲源目錄時,推薦使用 COPY。

  ADD

格式爲 ADD <src> <dest>。
該命令將複製指定的 <src> 到容器中的 <dest>。 其中 <src> 能夠是Dockerfile所在目錄的一個相對路徑;也能夠是一個 URL;還能夠是一個 tar 文件(自動解壓爲目錄)。
說白了add = copy + 自解壓

  CMD

支持三種格式

CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給須要交互的應用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啓動容器時執行的命令,每一個 Dockerfile 只能有一條 CMD 命令。若是指定了多條命令,只有最後一條會被執行。

若是用戶啓動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。

  ENTRYPOINT

兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋。
每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
說白了cmd是多個會被覆蓋,而entrypoint多個會追加

  ONBUILD

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 本文歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。

相關文章
相關標籤/搜索