docker學習

  1.docker簡介以及理念html

百度簡介:
  Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的linux機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。

官方簡介:
  Docker是一個開源的引擎,能夠輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試經過的容器能夠批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集羣和其餘的基礎應用平臺。 
 docker起源:
  Docker是 PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,源代碼託管在 Github 上, 基於go語言並聽從Apache2.0協議開源。
  Docker是經過內核虛擬化技術【namespaces(進入命名空間,工具是nsenter在util-linux安裝包裏面)以及cgroups等,kvm也是經過內核虛擬化的】來提供容器的資源隔離與安全保障。因爲docker經過操做系統層的虛擬化實現隔離,因此docker容器在運行時不須要相似虛擬機(vm)額外的操做系統開銷,docker是運行在操做系統裏面的,提升資源利用率。
 
 docker三大理念:
  構建,運輸和運行,也是代碼發佈的面臨的三個問題(能夠將運行程序和環境一塊兒打包成容器)

 saltstack能夠作到機器版本相同,能夠進行版本回滾,可是作不到環境回滾,docker能夠保證不一樣版本的環境一致性

docker到底能作什麼???
  1.簡化配置,能夠將運行環境和代碼同時放到docker裏面,也下降了代碼和運行環境的依賴性
  2.代碼流水線管理,將開發,測試,生產聚合成流水線同樣的使用方式,一次構建,屢次使用,保證一致性
  3.提升開發效率
  4.隔離應用,下降成本,提升資源利用率,沒什麼說的,沒有虛擬機隔離得好
  5.快速部署


總結:docker從不一樣方面的到底改變了什麼?

 



 

 

2.docker組成部分node

一個完整的Docker有如下幾個部分組成:
  1.dockerClient客戶端
  2.Docker Daemon守護進程
  3.Docker Image鏡像
  4.DockerContainer容器
  5.DockerRepository倉庫

  鏡像:能夠理解爲和虛擬機的鏡像相似,可是做用徹底同樣,就比如啓動一個kvm虛擬機就必須得有一個鏡像mysql

  容器:docker使用容器來運行,從鏡像建立了一個實例,容器與鏡像的關係相似於面向對象編程中的對象與類。容器:對象,鏡像:類,docker能夠對容器進行啓動,中止,刪除等操做,容器之間是相互隔離的,不是虛擬的,可是不會像虛擬機那樣隔離的很完全。linux

  倉庫:存儲鏡像的地方,至關於yum倉庫的做用,就像git有倉庫github同樣,docker也有鏡像的倉庫叫dockerhub,都是使用相同的命令nginx

  注意:docker的服務端掛掉以後,全部運行在docker上的容器都會掛掉git

  3.docker與虛擬機和openstack之間對比github

docker和虛擬機

 

  Hypervisor是虛擬機的管理軟件sql

  docker個虛擬機之間相差了一個虛擬機管理軟件,和操做系統,能夠看到docker直接運行在docker引擎上面的,而虛擬機是運行在操做系統上面的。可是虛擬機之間能進行徹底隔離,但docker沒法像虛擬機同樣提供徹底的資源隔離,甚至有的地方就不隔離,好比用戶空間。docker

  重點容器是給進程作隔離用的,虛擬機是給操做系統作隔離用的編程

  docker和openstack

   

  注意:

    1.管理簡單,意味着能操做的東西就簡單,比較少,還有一個就是在複雜的狀況下也就不明顯,好比100個容器,管理就不簡單了

    2.docker容器只能啓動單進程,而且必須啓動在前臺,若是前臺進程掛掉了,容器就終止了。不建議使用ssh(docker官方不建議經過ssh鏈接到容器,不要將容器當作虛擬機來使用)。

4.docker安裝(centos7)

4.1 Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。
  [root@node2 ~]# uname -r
  3.10.0-957.1.3.el7.x86_64  

4.2 使用  權限登陸 Centos。確保 yum 包更新到最新
   sudo yum updateroot
4.3 安裝須要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的
   sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4.4 設置yum源
   sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

4.5 能夠查看全部倉庫中全部docker版本,並選擇特定版本安裝
   yum list docker-ce --showduplicates | sort -r
   

 4.6 安裝docker
   sudo yum install docker-ce #因爲repo中默認只開啓stable倉庫,故這裏安裝的是最新穩定版17.12.0
   sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce

  

 4.7 加入開機啓動
  $ sudo systemctl start docker


  $ sudo systemctl enable docker

 4.8 驗證是否安裝成功
  docker version

  

5.docker入門

docker的三大組件:鏡像(Image),倉庫(Repository),容器(Container)必定要記住.
docker基礎
  啓動docker:systemctl start docker
    會幫咱們生成一個docker0的網橋,ip地址爲172.17.0.1
  經常使用命令:
    搜索鏡像:docker search centos 會去dockerhub上搜索有關centos鏡像
  
  獲取鏡像:docker pull centos 會去dockerhub上下載有關centos鏡像
   
  查看鏡像:docker images
   
  導出鏡像:docker save -o centos.tar centos(這個是在docker images裏面能夠看到的鏡像名字)
  刪除鏡像:docker rmi id號 刪除鏡像,在鏡像裏面有容器的話,刪除不了

  啓動容器:docker run centos(鏡像名稱) /bin/echo ‘hello world’,若是有參數,要寫在鏡像名稱前面,最後面跟上要執行的命令,要注意:docker必須在前臺啓動,當進程結束以後docker就退出了,因此上面命令執行完以後,docker的狀態就退出了
  
  查看docker狀態: docker ps -a(全部運行和不運行的都顯示),啓動容器的時候能夠經過--name指定容器名稱,如不指定,docker會自動生成一個隨機名稱
  
啓動一個帶名稱的docker容器
 啓動一個帶名稱的docker容器:docker run --name mytestdocker -t -i centos /bin/bash 新建一個mytestdocker的容器,鏡像是centos,而且分配一個僞終端和打開標準輸入,而且執行命令,注意:若是centos的鏡像沒有的話,docker會在dockerhub上pull下來,在啓動
 -t:讓docker分配一個僞終端
 -i:讓docker容器的標準輸入打開
 
 能夠看到咱們已經進入了容器內部,可是要注意:這不是虛擬機,而是docker的容器。經過查看docker的狀態能夠看到,容器id同樣,另一點是id爲1ac70a1ee153容器的pid爲1的是/bin/bash,而centos7中pid爲1的是systemd,退出輸入exit


容器是給進程作隔離的,虛擬機是給操做系統作隔離的,容器不能徹底隔離,可是虛擬機能夠操做系統徹底隔離
 在容器上執行free -m

在啓動容器的虛擬機裏面執行free -m,能夠看到容器並不徹底隔離

中止容器 exit

從新啓動被關閉的容器 docker start mytestdocker/容器id

可是咱們發現,這回進不去容器內部了,是node2不是容器id了,該怎麼進去哪?
不能進去了,由於這是docker的理念,能夠在建立一個容器,但不能修改這個容器了。
可變基礎設施的概念很是適合docker理念
可是可使用命令來進入docker attach mydockertest


中止容器:docker stop 容器id/容器名稱
刪除容器:docker rm -f(刪除正在運行的容器) 容器id/容器名稱
執行完命令以後刪除容器:docker run --rm centos /bin/echo "hehe"

 docker進入方式

背景:
  在開啓docker以後,根據docker的理念【不可變的基礎設施】,在容器執行exit以後,docker就關閉掉了,以後就不能進入docker內部。可是能夠經過從新啓動docker容器,來進行從新管理容器,可是這與docker的理念不相符
而且在生產環境中,若是輸入了一個exit就將正在使用的docker容器關掉的話,也比較危險,因此,推薦另外一種進入docker的方式。

1.nsenter
在前面知道docker是經過內核級虛擬化提供容器資源隔離和安全保障,咱們也能夠經過namespaces的工具nsenter來進入docker容器
  yum install -y util-linux nsenter工具在util-linux包裏面
[root@node2 ~]# nsenter --help
Usage:
nsenter [options] <program> [<argument>...]
Run a program with namespaces of other processes.
Options:
-t, --target <pid> target process to get namespaces from
-m, --mount[=<file>] enter mount namespace
-u, --uts[=<file>] enter UTS namespace (hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
-S, --setuid <uid> set uid in entered namespace
-G, --setgid <gid> set gid in entered namespace
--preserve-credentials do not touch uids or gids
-r, --root[=<dir>] set the root directory
-w, --wd[=<dir>] set the working directory
-F, --no-fork do not fork before exec'ing <program>
-Z, --follow-context set SELinux context according to --target PID
-h, --help display this help and exit
-V, --version output version information and exit
For more details see nsenter(1).

 # docker inspect -f {{.State.Pid}} 容器名或者容器id   //每個容器都有.State.Pid,因此這個命令除了容器的id須要咱們根據docker ps -a去查找,其餘的所有爲固定的格式
 # nsenter --target 上面查到的進程id --mount --uts --ipc --net --pid    // 輸入該命令便進入到容器中
 -- mount 參數是進去到 mount  namespace中
  --uts參數是進入到uts namespace中
  --ipc參數是進入到System V IPC namaspace中
  --net參數是進入到network namespace中
  --pid參數是進入到pid namespace中
  --user參數是進入到user namespace中。目前docker還不支持
 

 咱們能夠看到有兩個bash,第一個/bin/bash是容器執行的第一個進程,-bash是咱們nsenter建立的bash,因此退出容器,容器不會中止,由於/bin/bash還在繼續跑着,輸入exit,查看docker狀態,能夠看到容器還在運行,沒有中止

 

 使用腳原本管理docker的容器

#!/bin/bash
# 2018年12月25日19:40:04
# Use nsenter to access docker
docker_in(){
docker_name=$1
pid=$(docker inspect -f "{{ .State.Pid }}" $docker_name)
nsenter -t $pid -m -u -i -n -p
}

docker_in $1

 執行結果

 

 2.docker exec

 不進入容器執行命令:docker exec mydockertest whoami

 

 經過exec進入容器: docker exec -it mydockertest /bin/bash

 

 3.docker attach

 

 

6.docker網絡訪問

 docker run 參數 -d 啓動一個容器在後臺運行而且打印容器id


」nginx -g daemon off「:守護進程掛掉了,覺得nginx不能運行在docker的後臺,由於docker只能在前臺運行,因此docker自殺了
  of是在後臺的方式運行,可是docker默認是單線程而且必須運行在前臺,若是容器運行的命令不是那些一直掛起的命令(好比運行,tail),就是會認爲沒事作,就自動退出了
  
docker logs LcsCentostopdocker 容器默認會把容器內部第一個進程,也就是pid=1的程序做爲docker容器是否正在運行的依據,若是docker 容器pid掛了,那麼docker容器便會直接退出。
  docker run的時候把command最爲容器內部命令,若是你使用nginx,那麼nginx程序將後臺運行,這個時候nginx並非pid爲1的程序,而是執行的bash,這個bash執行了nginx指令後就掛了,因此容器也就退出了,和你這個同樣的道理,pm2 start 事後,bash 的pid爲1,那麼此時bash執行完之後會退出,
  因此容器也就退出了

查看容器的訪問日誌:
網絡訪問
  docker的網絡訪問其實是經過服務器的nat映射到docker容器裏面的ip
隨機映射:
  docker run -d -P --name testnginx nginx :將docker容器內的80端口映射到本地的隨機端口,注意隨機映射是大P

 查看服務器上iptables的nat映射

 

 指定映射
   docker run -d -i -t -p 192.168.10.232:80:80 --name 'NginxTest' nginx :將docker容器的80端口映射到本地的80端口,注意用小p

   

 指定多個端口映射
   docker run -d -i -t -p 81:80 -p 443:443 --name "nginxtest" nginx :注意不要使用本地映射過得端口

 

 查看容器映射端口
   docker port LcsNginx

 

 在nginx容器中執行命令(若是沒有ifconfig命令,經過apt-get install -y net-tools,須要先apt-get update)

 

 7.docker數據管理

數據卷方式:dockerfile中不可用

第一種掛載寫法:目錄隨機掛載

  建立一個nginx的鏡像掛在到/data   docker run -d -i -t --name nginx-volume-test1 -v /data nginx

  執行mount能夠看到nginx的容器掛載了不少鏡像  

  

  mount出來的/data目錄在本地那個地方那?

  

  在/var/lib/docker/volumes/da16024b9c81a80d4bcf9076c6f81cde4f23f8092865a87ca9551f87a5dbd9b3/_data目錄下touch一個文件,容器裏面的data目錄下也會出現一個文件

第二種掛載寫法:指定目錄掛載

  docker run -d -i -t --name "nginx-volumn-test2" -v /data/nginx-volumn-test2:/data -p8080:80 -p8443:443 nginx

  還能夠掛載文件

  docker run --rm  -i -t -v /root/.bash_history:/1.txt nginx /bin/bash

數據卷容器方式:可讓一個容器訪問另外一個容器的數據卷,無論容器是否運行,可讓數據在多個容器之間共享

  docker run -it --name volume-test3 --volumes-from nginx-volumn-test2 centos /bin/bash

  咱們在上面建立的nginx-volumn-test2容器裏面的data目錄touch一個123

  

  nginx-volumn-test2 的/data目錄

  

  注意:數據卷容器只要有volume的鏈接就不會被刪除,例如上面的nginx-volumn-test2,若是有其餘容器在使用其數據卷,nginx-volumn-test2就不能被刪除

 8.docker鏡像構建

獲取全部docker容器的id
   docker ps -a -q
  

 kill全部正在運行的容器

    docker kill $(docker ps -a -q )

  
刪除全部容器
   docker rm $(docker ps -a -q)
  
手動構建鏡像
 1.基於centos鏡像建立一個名爲nginx-20181228的的容器
  docker run --name nginx-20181228 -it centos
  
2.安裝epel源用來安裝nginx
  [root@a1a6fb8030c1 /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
 3.安裝nginx和vim
  [root@a1a6fb8030c1 /]# yum install -y nginx && yum install -y vim
 4.修改nginx的配置文件,禁止後臺啓動,由於docker是前臺啓動
  
[root@a1a6fb8030c1 /]# vim /etc/nginx/nginx.conf 在開頭填加一行 daemon off;
5.退出容器,提交容器到鏡像
  [root@node2 ~]# docker commit -m "My Nginx" a1a6fb8030c1 lcs/mynginx:v1 --->提交一個描述爲"My Nginx",id爲a1a6fb8030c1的容器到lcs倉庫版本號爲v1
  sha256:c47531b36ad45f4d77e6673ce4f92d2233ba70691088dcf7333c35f15fbc8784
 6.查看鏡像,能夠看到基於cengos的鏡像製做的nginx的鏡像是原來的2倍還多
  
  7.使用咱們建立的鏡像來建立一個nginx的容器
  

  dockerfile構建鏡像

  1.編寫Dockerfile文件,注意Dockerfile要大寫

[root@node2 nginx]# cat Dockerfile
#This Dockerfile                                                                              #註釋

#Base image
FROM centos                                                                                   #尋找基礎鏡像

#Maintainer
MAINTAINER nobody xxx@gmail.com                                                               #鏡像建立人

#Common                                                                                  
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm                 #執行命令
RUN yum install -y nginx && yum clean all
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html                                               #添加index.html到/usr/share/nginx/html/index.html
EXPOSE 8888                                                                                   #使用端口
CMD ["nginx"]                                                                                 #運行nginx

  2.構建docker鏡像
  [root@node2 nginx]#docker build -t mynginx:v2 .  -->"."指的是當前路徑下,必需要Dockerfile文件和index.html文件

  

  3.使用新構建的鏡像建立容器(命令的後面也能夠不加nginx,由於Dockerfile裏面已經指定了容器啓動完成以後要輸入的命令)

  

 9.DockerFile的應用

生產supervisor Dockerfile  Dockerfile2  dockerfile  docker文章

企業中docker使用:
  1.系統環境層 -->建立本身要使用的系統環境層(centos)的Dockerfile
    1.1 建立本身要使用的系統環境(centos)層的Dockerfile
    [root@node2 centos]# vim /opt/system/centos/Dockerfile
    #Docker for Centos
    #Base image
    FROM centos
    #Maintainer
    MAINTAINER lcs xx@hmail.com
    #EPEL
    ADD epel.repo /etc/yum.repos.d/
    #Base pkg
    RUN yum install -y wget mysql-devel supervisor git redia tree net-tools sudo psmisc && yum clean all
    1.2 使用Dockerfile來建立系統層鏡像centos
    [root@node2 centos]# docker build -t lcs/centos:base .
    Complete!
    Loaded plugins: fastestmirror, ovl
    Cleaning repos: base epel extras updates
    Cleaning up list of fastest mirrors
    Removing intermediate container 820056af890c
    ---> 6e83dbdc96c5
    Successfully built 6e83dbdc96c5
    Successfully tagged lcs/centos:base
    1.3 查看鏡像
    [root@node2 centos]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    lcs/centos base 6e83dbdc96c5 5 seconds ago 295MB
    nginx latest 02256cfb0e4b 34 hours ago 109MB
    centos latest 1e1148e4cc2c 3 weeks ago 202MB
2.
 

 10.docker倉庫

 

docker命令幫助

[root@node2 ~]# docker --help
Usage:    docker COMMAND
A self-sufficient runtime for containers
Options:
      --config string      Location of client config files (default "/root/.docker")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  config      Manage Docker configs
  container   Manage containers
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images (experimental)
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container                   #進入一個正在運行的容器中,docker attach 容器名稱/容器id
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  exec        Run a command in arunning container                                                             #經過exec執行命令 docker exec 容器id/容器名稱 whoami 或者經過exec進入容器 docker exec -it 容器id/容器名稱 /bin/bash
  events      Get real time events from the server 
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects                                                  #獲取容器內第一個進程的pid,docker inspect -f "{{ .State.Pid }}" 容器名稱
  kill        Kill one or more running containers           
  load        Load an image from a tar archive or STDIN                                                       #導入一個鏡像 docker load <nginx.tar
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry                                                   #下載一個鏡像到倉庫 docker pull nginx
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers                                                                  #重啓容器
  rm          Remove one or more containers                                                                   #刪除容器
  rmi         Remove one or more images                                                                       #刪除鏡像
  run         Run a command in a new container                                                                #啓動一個容器 docker run --name testdocker -i -t centos /bin/bash
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images                                                                #在dockerhub上搜索一個鏡像
  start       Start one or more stopped containers                                                            #啓動容器
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers                                                             #中止容器
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information                                                             #查看docker版本
  wait        Block until one or more containers stop, then print their exit codes

 

x.docker的學習途徑

 

 docker工具

compose:使用Python語言開發,將多個相關的容器配置在一塊兒,從而能夠同時建立、啓動、中止和監控它們。
machine:幫助安裝docker到指定位置,包括本地虛擬機、遠端雲主機等,同時還管理這些主機的信息,能夠很方便的操做安裝在不一樣主機上的這些docker。
kitematic:桌面版的docker客戶端(圖形界面),使用JavaScript基於electron開發。
toolbox:幫助安裝docker環境到Windows和Mac平臺,包括Docker引擎、Compose、 Machine和 Kitematic,固然docker引擎是安裝在虛擬機裏面的,本地只有客戶端,使用哪一個虛擬機依賴於平臺,toolbox會幫你搞定這一切。
distribution:Registry 2.0的實現,主要是管理和分發docker鏡像,Docker Hub背後的技術。
swarmkit:嵌入在docker裏面的容器編排系統,能夠簡單的把它和docker的關係理解成IE瀏覽器和Windows的關係,捆綁銷售。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

啦啦啦

相關文章
相關標籤/搜索