【docker】docker介绍安装和使用

 

一.docker简介:

     docker是容器技术的一个代表,而容器技术是将程序打包和隔离的一种技术,其实它并不是一个新技术,之前在linux内核中早已存在,真正被大众所用所了解是因为docker的出现。docker之所以流行起来,是因为解决了一些计算机领域的痛点,它解决了软件包装的问题,保证开发与运维及测试环境的一致。docker可以将任何应用以轻量级容器的形式来打包,迁移发布和运行。可以简单的认为是一个轻量级的虚拟机,但是也不算是虚拟机。

  2013年docker开源,它跨平台,支持windows,Mac,Linux系统。Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎.

  docker官网:https://www.docker.com/

  docker的github托管地址:https://github.com/docker

  docker官方文档:https://docs.docker.com/get-started/

  

 

二. Docker思想:

    1.集装箱

     docker的logo是一个鲸鱼上面装着很多集装箱,想象下在没有集装箱之前,运输货物非常零散,没有规矩,运输过程中说不定有些东西会掉了,优良集装箱,所有货物就被密封在集装箱中,集装箱很大也不容易丢失,这样就保证了我们货物的安全原样的送到目的地。那么我们可以把货物想象成我们的程序,假如能把一台机器上的程序部署到新的一台机器上,那么会拷贝过去,但是这过程中有可能会因为人为的疏忽少拷贝了一些配置文件或者相关文件,导致在另一台机器上程序启动不起来。有了docker的集装箱就是帮我们解决这样的问题,它会保证我们的程序不管在哪运行不会缺少应有的东西。

    2.标准化

    可以从三个方面解释标准化,1.运输方式的标准化。2.存储方式标准化。3.Api接口标准化。

    3.隔离

     docker是一种轻量级容器,它有自己的一套内部环境,比如cpu,内存,磁盘等,可以隔离外面主机。docker使用了LXC技术来实现这种独立的环境,LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化,这是一种轻量级的容器虚拟化,可以实现docker环境的快速建立,销毁。

 

三.docker能解决哪些问题

    1.解决环境不一致:

      经常遇到开发在本地运行没错,测试那边运行同一个程序出现问题。出现这种问题一般都是运行环境不一致导致的。一个应用程序运行需要一系列的依赖,如操作系统,web服务器,相关的配置文件,对应的编程语言的代码及相应程序解释器等等,如果其中一个变了程序就有可能失败,比如程序调用了一些系统命令,但是换个环境没有这些命令,那么就会导致程序启动失败,程序的版本也会导致程序的错误,如php7和php5.3语法就有些不一样。

    而docker就会把所有所需要的配置文件,程序代码等所需要的一切环境打包到一个集装箱中,相当于把开发环境打了一个包,这个包环境和开发的本地的环境一摸一样,这样就保证了运行环境的一致性,这个包就可以被测试引用到他本地运行,所以docker就是解决环境不一致的问题。

    2.程序隔离

      Linux是多用户系统,上面可以运行多种程序和服务,当其中一个程序或服务运行出现故障时候,消耗很多cpu,或者大量IO操作,占用大量内存,会牵连服务器上的其他运行中的软件,而docker可以避免这种情况出现。因为docker本身就是一个个独立隔离的环境,在docker启动的时候就会被限定使用多大的内存及其他资源使用限度,所以docker环境里的程序出现问题也会只是影响这个docker里的程序,不会影响其他服务和程序。

    3.资源快速扩张和弹性伸缩

      现在电商系统经常会有秒杀活动,还有双十一,618这样特别的促销活动。每当这样的节日来临时候,电商系统都会面临大量的访问,所以需要更多的软硬件资源去应对这样大量的访问量,而平时却不需要这么多的服务器,不如也会造成极大的浪费,所以在节假日来临前扩充可以应对节日所需要的服务器数量,节日之后在将这些多余的服务器下线,但是这会给运维带来非常大的工作量,因为运维需要分别给每台机器搭建环境配置所需要点一切软件,并且还得调试,这是一个非常繁琐的过程。但是docker让这些事变得简单,只需要通过docker管理软件点击鼠标配置下,就会立马从10台服务器变成100台或者更多。

 

 四.docker核心技术

     docker里面有三个核心的词汇镜像,仓库,容器,镜像是上面例子中的集装箱,仓库是存放镜像的地方,容器是运行程序的地方。docker运行一个程序的过程就是去仓库把镜像拉到本地,然后用docker命令在本地把docker运行起来。

    1.镜像(image):从本质上来说镜像就是一系列的文件,可以包括应用程序的文件,也可以包括运行环境的文件,这些镜像文件用一种特殊的文件格式来保存。linux有种存储技术叫做联合文件系统(Union File System),这是一种分层的文件系统,可以将不同的文件目录挂载在同一个虚拟文件系统下。怎么理解呢,下面有个例子。

songguojundeMBP:~ songguojun$ ls dir1    //在dir1目录下看到下面三个目录
Desktop        Downloads    Movies        
songguojundeMBP:~ songguojun$ ls dir2    //在dir2目录下看到下面另外三个目录
code Documents Library songguojundeMBP:~ songguojun$ ls dir //联合文件系统中,在dir目录下看到下面六个目录,也就是上面两个目录共同的目录文件集合 Desktop Downloads Movies code Documents Library

     其实就是联合在不同磁盘上的不同的文件系统到一个公共目录下。通过联合文件系统可以实现文件的分层,docker镜像就是利用这种分层的概念来实现镜像存储。下面这张图就是镜像存储格式。

    

    在Docker镜像分为基础镜像和父镜像,没有父镜像的镜像被称为基础镜像。用户是基于基础镜像来制作各种不同的应用镜像。这些应用镜像共享同一个基础镜像层,提高了存储效率。

    2.容器(container)

      容器的本质就是一个运行在服务器上的进程,docker镜像中的每一层文件都是只读的,只有最上面一层上可写的,这一层就是容器,容器这一层是可写的,当容器对下一层的镜像去写东西,会将下一层的镜像中要修改的文件拷贝一份到最上层容器中,然后在对它修改,修改之后当程序读取这个最新的文件,因为程序读取会从最顶层开始查找。由于镜像是不可以修改的,所以同一个容器可以生成多个容器独立运行,它们之间没有任何干扰。

 

    镜像和容器区别:

      镜像其实是有多个只读层,它们重叠在一起,除了最上面一层可写其它都是只读模板,而容器就是镜像的一个运行实例。

    3.仓库(repository)

      仓库就是存放镜像的地方,可以使用docker pull命令从docker hub拉取我们需要的镜像,进行操作。docker有官方等其他公司提供的镜像中心,也支持搭建自己私有的镜像中心。

      常用仓库地址列表:

        hub.docker.com (docker官方仓库)

        c.163.com(网易蜂巢)

 

        hub.docker.com 里面常用镜像列表

         

 

 五.Docker 架构

  

 

                docker架构图

  1.DOCKER_HOST:docker操作宿主机,上面运行了Docker daemon核心程序,负责各种docker操作,比如下载docker镜像或者运行一个容器。

  2.Client:客户端用命令和Docker daemon交互,比如pull,build ,run等,交给Docker daemon来操作,和远端镜像仓库交互。

  3.Registry:公司的sass服务,是存放 Docker 镜像的仓库,Docker daemon可以和Registry交互。

 

 六.docker的安装

  安装docker先看下centos版本

[root@localhost ~]# uname -r
3.10.0-514.21.2.el7.x86_64

 

   第一个命令,下载

wget -qO- https://get.docker.com/ | sh

 

   下载完后,docker默认情况是允许root去运行,所有建议添加一个用户到docker组

  先查看用户组

cat /etc/group

 

   

  我们添加一个用户

[root@localhost docker]# usermod -aG docker songguojun

 

  #groups 查看当前登录用户的组内成员

  查看加入情况

cat /etc/group

 

   

  查看docker是否安装成功

docker info

 

   如果出现下面命令

  

  说明docker服务没有启动

  我们启动下

service docker start

 

  

  在执行 docker info

  

  docker安装成功

  我们可以直接输入docker命令 查看docker命令的选项

  

 

  我们看到里面有个run参数,意思是在一个新容器中执行命令,可以单独查看这个参数意思

[root@localhost ~]# docker run --help

Usage:    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds

 docker window安装:https://docs.docker.com/docker-for-windows/install/

     Mac安装:https://docs.docker.com/docker-for-mac/install/

    更多安装参考: http://www.docker.org.cn/book/install/supported-platform-17.html

七.docker的使用

  我们先输入以下命令

songguojundeMBP:java songguojun$ docker run centos echo  hello docker   #这个命令作用是用docker运行centos镜像 并输出hello docker字符串
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos                      #在docker运行镜像前会查看本地环境是否有这个要运行等镜像 这里就是查看centos这个镜像,发现没有就从远端读取开始下载
8ba884070f61: Pull complete 
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
Status: Downloaded newer image for centos:latest              #镜像下载成功
hello docker                                    #输出字符串

查看本地有哪些镜像

songguojundeMBP: songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              9f38484d220f        3 months ago        202MB     

 运行nginx服务

songguojundeMBP: songguojun$ docker run -p 8080:80 -d daocloud.io/nginx    #-d参数代表守护进程
Unable to find image 'daocloud.io/nginx:latest' locally
latest: Pulling from nginx
743f2d6c1f65: Pull complete 
6bfc4ec4420a: Pull complete 
688a776db95f: Pull complete 
Digest: sha256:e770165fef9e36b990882a4083d8ccf5e29e469a8609bb6b2e3b47d9510e2c8d
Status: Downloaded newer image for daocloud.io/nginx:latest
720bfbd6d9beaaea8b7bb9506c6e45345a4dcd29e6486a4798b4aa31488fba13

 

上面开启了本地nginx服务,我们在浏览器上输入http://localhost:8080/

 

查看当前运行的容器

songguojundeMBP: songguojun$ docker ps      #显示当前正在运行的容器   docker ps -a 列出所有的容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
720bfbd6d9be        daocloud.io/nginx   "nginx -g 'daemon of…"   29 seconds ago      Up 28 seconds       0.0.0.0:8080->80/tcp   quirky_blackwell

 CONTAINER ID:容器id

 PORTS:端口映射关系

 修改nginx默认首页

songguojundeMBP:tmp songguojun$ cat index.html 
<html>
<h1>hello docker</h1>
</html>
songguojundeMBP:tmp songguojun$ docker cp index.html  720bfbd6d9be://usr/share/nginx/html

 

 再次查看

不过这个修改只是暂时的,当再次重启容器时候,之前的修改都会消失。

停止docker容器

songguojundeMBP:tmp songguojun$ docker stop 720bfbd6d9be
720bfbd6d9be

再次设置

[songguojundeMBP:tmp songguojun$ docker run -p 8080:80 -d daocloud.io/nginx      # -d表示守护进程
3a69a07abb20cd12b238063ca8aaa6aa07d592266eb0e93d93ea9a0c15853375
[songguojundeMBP:tmp songguojun$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
3a69a07abb20        daocloud.io/nginx   "nginx -g 'daemon of…"   24 seconds ago      Up 22 seconds       0.0.0.0:8080->80/tcp   festive_khorana
[songguojundeMBP:tmp songguojun$ docker cp index.html  3a69a07abb20://usr/share/nginx/html
[songguojundeMBP:tmp songguojun$ docker commit -m 'fun' 3a69a07abb20 nginx-newimage     保存image
sha256:8c9627568f55f12c1fe8b561253ef89bdc58b6511f513b3de2759122dc4e6203     新产生的image的id
[songguojundeMBP:tmp songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx-newimage      latest              8c9627568f55        21 seconds ago      109MB     这个是上面新产生的image
daocloud.io/nginx   latest              53f3fd8007f7        6 weeks ago         109MB
centos              latest              9f38484d220f        3 months ago        202MB

 

启动容器并进入该容器中

songguojundeMBP:docker songguojun$ docker run -i -t centos /bin/bash   #启动一个centos容器及启动容器时候到命令 /bin/bash
[root@5ce0363609a4 /]# ls                #当前centos容器环境  说明已经进入了  5ce0363609a4是容器的名字
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

 

 

八.Dockerfile

  上面我们通过docker commit可以创建一个新的镜像,我们也可以通过一个配置文件去一步步构建docker build新的镜像,这个配置文件就是Dockerfile,可以帮助我们从一个基础镜像开始建立一个自定义镜像,使用配置文件的方式可以更加方便。

编写Dockerfile文件

 

[songguojundeMBP:docker songguojun$ cat Dockerfile 
FROM alpine:latest                   #alpine是专门针对docker做的一个极小的linux环境  image会非常小
MAINTAINER xbf
CMD echo "hello Docker"

 

然后用docker build构建

[songguojundeMBP:docker songguojun$ docker build -t hello_docker .     #构建
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine:latest
latest: Pulling from library/alpine
921b31ab772b: Pull complete 
Digest: sha256:ca1c944a4f8486a153024d9965aafbe24f5723c1d5c02f4964c045a16d19dc54
Status: Downloaded newer image for alpine:latest
 ---> 4d90542f0623
Step 2/3 : MAINTAINER xbf
 ---> Running in 5c0c87f55732
Removing intermediate container 5c0c87f55732
 ---> 92236846ad7f
Step 3/3 : CMD echo "hello Docker"
 ---> Running in 86e5f878788c
Removing intermediate container 86e5f878788c
 ---> 7378acc65286
Successfully built 7378acc65286
Successfully tagged hello_docker:latest

[songguojundeMBP:docker songguojun$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello_docker        latest              7378acc65286        2 minutes ago       5.58MB #这个就是生成的新的image
<none>              <none>              8c9627568f55        15 hours ago        109MB
alpine              latest              4d90542f0623        3 days ago          5.58MB
daocloud.io/nginx   latest              53f3fd8007f7        6 weeks ago         109MB
centos              latest              9f38484d220f        3 months ago        202MB

[songguojundeMBP:docker songguojun$ docker run hello_docker #运行
hello Docker

 编写Dockerfile文件去运行

 编写Dockerfile文件如下

FROM ubuntu
MAINTAINER songguojun
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

 

构建

songguojundeMBP:dockefile2 songguojun$ docker build -t songguojun/run-nginx .      # 点.代表当前目录上下文
Sending build context to Docker daemon  3.072kB
Step 1/8 : FROM ubuntu
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest
 ---> 4c108a37151f
Step 2/8 : MAINTAINER songguojun
 ---> Running in 7f9ca70095c4
Removing intermediate container 7f9ca70095c4
 ---> 671c843cfffd
Step 3/8 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
 ---> Running in 6238932a7dca
Removing intermediate container 6238932a7dca
 ---> 4f672cace3ec
Step 4/8 : RUN apt-get update
Removing intermediate container 6e93cc3d0300
 ---> dfc95c276b1d
Step 6/8 : COPY index.html /var/www/html
 ---> 2407837e404b
Step 7/8 : ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
 ---> Running in f66729e00481
Removing intermediate container f66729e00481
 ---> 7e34bc3f7eb6
Step 8/8 : EXPOSE 80
 ---> Running in 3dbdd072eaa8
Removing intermediate container 3dbdd072eaa8
 ---> 2d0b94c15efc
Successfully built 2d0b94c15efc
Successfully tagged songguojun/run-nginx:latest

 

运行

songguojundeMBP:dockefile2 songguojun$ docker run -d -p 80:80 songguojun/run-nginx 
08f8f58bf0bf8977a528a33bd35efca667dfb71cc4ca45017bdade452ad736da
songguojundeMBP:dockefile2 songguojun$ curl http://localhost:80

docker runing            #这个是index.html文件里的内容

 

 

 Dockerfile指令

   Dockerfile指令都是大写,后面跟着参数。

指令参数作用
FROM base image
RUN执行命令
ADD添加文件,可以将远程的文件添加入容器
COPY拷贝文件
CMD执行命令
EXPOSE暴露端口
WORKDIR指定路径
MAINTAINER维护者
ENV设定容器里的环境变量
ENTRYPOINT容器入口,和CMD类似
USER指定用户
VOLUMEmount point,指定容器所挂载的卷

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

镜像分层

   Dockerfile配置文件里每一条命令都会产生一个新层,每一层对应一个独立的字符串id。

  

  上面黄色一层表示容器层,是可读可写,它产生于image运行后,这样保证容器是可以改变的。下面红色的是只读。

  分层的好处可以使相同的层在不同的image里复用。

 

九.Docke存储技术Volume

  volume是提供独立于容器外的持久化存储。

songguojundeMBP:~ songguojun$ docker run -d --name  nginx -v /usr/share/nginx/html nginx
42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9
songguojundeMBP:~ songguojun$ docker inspect nginx #获取容器/镜像的元数据.
[
    {
        "Id": "42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9",
        "Created": "2019-07-01T12:23:20.678195837Z",
        "Path": "nginx",
        "Args": [
            "-g",
            "daemon off;"
        ],
        "State": {
.......

 "Mounts": [
            {
                "Type": "volume",
                "Name": "060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934",
                "Source": "/var/lib/docker/volumes/060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934/_data", #宿主机的路径,会挂载到下面容器内的路径
                "Destination": "/usr/share/nginx/html", #容器内部的路径
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
............

 

   

 

下面列出docker常用命令

 

命令作用
docker version查看docker版本。
docker-compose --version查看compose 版本信息
docker pull 从远端获取image
docker build 创建image
docker images列出本地已有image
docker run运行container
docker ps列出container
docker rm删除已经结束的container
docker rmi删除一个image
docker cp在host和container之间复制文件
docker commit保存已经被改动的image生成一个新的镜像

转载于:https://www.cnblogs.com/songgj/p/8446490.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值