zoukankan      html  css  js  c++  java
  • Docker

    Docker

    Docker于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 是世界领先的软件容器平台。Docker 属于 Linux 容器的一种封装,它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。Docker容器除了运行容器中的应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

    Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。

     

    相关概念

    Docker是CS架构,主要有两个概念:

    ●Docker daemon: Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互

    ●Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon

    再来了解一下Docker的三个主要概念:

    ●Docker image:镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container(容器),一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。

    ●Docker container:容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。

    ●Docker hub/registry: 共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。

    仓库就是装存储镜像的地方,镜像就相当于打包好的版本,镜像启动之后运行在容器中。

    Docker安装---linux

    Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。

    1、yum install docker

    2、service docker start   #启动 docker 服务

    chkconfig docker on   #设置为开机启动

    注:如采用CentOS 7中支持的新式 systemd 语法,如下:

    systemctl start docker.service

    systemctl enable docker.service

    3、docker version   返回docker的版本相关信息,证明docker安装成功。

    4、docker pull hello-world来拉取hello-world镜像,测试docker hello

    docker pull hello-world

    因为国内连接 Docker 的官方仓库很慢,因此我们在日常使用中会使用Docker 中国镜像。该镜像托管于中国大陆,该镜像库只包含流行的公有镜像,私有镜像仍需要从美国镜像库中拉取。要使用Docker中国官方镜像只要修改系统中docker对应的配置文件即可,如下:

    vi  /etc/docker/daemon.json

    #添加

    {

        "registry-mirrors": ["https://registry.docker-cn.com"],

        "live-restore": true

    }

    Docker中国官方镜像https://registry.docker-cn.com

    官方镜像仓库:https://hub.docker.com/explore/

    DaoCloud镜像仓库 https://www.daocloud.io/

    阿里云镜像仓库 https://dev.aliyun.com/search.html?spm=5176.775974865.0.0.Iot0iJ

    网易蜂巢镜像仓库 https://c.163.com/

    5、运行hello-world

    docker run hello-world

    deepin安装docker

    切换到root用户,执行curl https://get.docker.com | bash

    Centos上安装Docker-CE,后运行docker run hello-world报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    解决办法

    $ systemctl daemon-reload

    $ sudo service docker restart

    $ sudo service docker status (should see active (running))

    $ sudo docker run hello-world

    可视化管理工具

    Docker的可视化管理工具有DockerUI、Shipyard、Rancher、Portainer。其中 portainer功能完善,目前持续维护更新,推荐选择它作为Docker管理工具。

    下载Portainer镜像

    docker search portainer  # 查询当前有哪些Portainer镜像

    docker pull portainer/portainer  # 下载镜像

    运行Portainer

    Portainer运行方式有以下两种方式:

    3.1、单机版运行

    如果仅有一个docker宿主机,则可使用单机版运行,运行以下命令就可以启动了:

    docker run -d -p 9003:9000  --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test  portainer/portainer

    该语句用宿主机9000端口关联容器中的9000端口,并给容器起名为portainer-test。启动成功后,使用该机器IP:PORT即可访问Portainer。

    浏览器中输入http://本机IP:9003,登录

    首次登陆需要注册用户,给admin用户设置密码:

    单机版这里选择local即可

     

    3.2、集群运行

    在有多台Docker的情况下,进行集群管理就十分重要了,Portainer也支持集群管理

    通过以下命令启动

    docker run -d -p 9000:9000 --restart=always --name prtainer-test portainer/portainer


    选择Remote

     

    输入swarm01的ip,然后点击Connect。登录成功之后如下

     

    可以在Endpoints中新增Docker节点,新增之后,如下

     

    然后通过如下方式进行切换节点

     

    双击

     

    Docker在windows下的安装和配置

    win10系统直接下载Docker Desktop即可,https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe

    如果是 win10 之前的系统就下载「Docker Toolbox」https://download.docker.com/win/stable/DockerToolbox.exe

    下载完成之后默认一直点下一步就安装完成了。docker安装过程中会检查Hyper-V,如果没有则默认添加启动,安装完成之后,你可以查看Hyper-V管理器,如果安装正常,会如下默认创建一个linux虚拟机:

    安装成功之后我们就可以对其进行相应的设置

    1. 右击小鲸鱼图标,点击Settings

    2. 设置界面如下,其中Shared Drives 可以设置我们的对应映射驱动盘,保证C盘选中,再选中你应用所在盘符。Advanced选项中你可以设置docker对应的CPU,内存占用资源。Netword主要是当前的Docker IP信息。Proxies可以设置对应的代理信息。Daemon 主要是设置对应的仓储和对应的仓储镜像站点(和docker镜像区分开,这个是仓储对应的镜像,因为访问国外站点过慢,可以设置国内的镜像代理站点)。

     

     这里特别强调一下,因为访问Docker官网仓储站点拉取镜像过慢,可以找仓储代理站点,国内的网易,DaoCloud都有对应的免费加速器,这里是我的设置:

    3. 同时Docker for Windows 提供了容器的界面管理工具 Kitematic 。Kitematic 需要的依赖软件包括 Virtual Box 和 Docker。如果已经在系统上安装了 Virtual Box,它会把它升级到最新版本。

    安装 Kitematic所需的依赖 Docker 和 Virtual Box 安装完成并运行后,会让我们登录到 Docker Hub。如果我们还没有账户或者还不想登录,可以点击 SKIP FOR NOW 继续后面的步骤。

    完成之后,就会出现 Kitematic 应用程序的第一个界面。正如下面看到的这样。我们可以搜索可用的 docker 镜像。

    启动 Kitematic

     

    然后我们创建一个mongodb的容器:

    点击Create,第一次后自动下载image到本地。

    你会发现我们无法正常的指定本地路径,主要是需要开启Docker的“Shared Drivers”:

    选择需要共享的盘符,不建议选择C盘。然后你会发现无法正常设置指定的盘符,这又是怎么回事儿呢?

    主要原因有两个:

    1.检查防火墙,是否允许Docker访问443端口

    2.重新安装vEthernet (DockerNAT)网络适配器的"Microsoft网络的文件和打印机共享"服务

    重启电脑,然后再次开启共享磁盘。成功设置后,再配置挂载卷的本地路径就可以了。

    在docker for win中使用portainer管理容器

    可以在Kitematic图形管理工具,搜索portainer镜像

    创建镜像,制定端口到宿主机9000端口(这个自定义)

    宿主机直接访问http://localhost:9000即可

    配置节点,我们选择远程连接方式

    这里有个很隐晦的地方,就是主机的ip地址我们怎么填,在docker for win中我们需要先打开2375端口

    从这里看是localhost,这个是宿主机,那么我们的portainer是在虚拟机里的,那么对于虚拟机来说如何访问宿主机的docker服务呢?

    其实很简单,我们只需要填写docker.for.win.localhost:2375即可。

    连接成功

    我们可以方便的使用portainer进行容器的管理了。

    Hello World

    下面通过最简单的 image 文件"hello world",感受一下 Docker。

    docker pull library/hello-world     #将 image 文件从仓库抓取到本地,library/hello-world是 image 在仓库里面的位置,hello-world是 image 的名字。

    docker images   # 查看image 文件

    docker run hello-world  #运行 image 文件

    输出这段提示以后,hello world就会停止运行,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如Mysql镜像等。

    mysql

    # docker pull mysql #从docker中拉取MySQL镜像

    # docker images #查看镜像

    #docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql #创建并启动一个MySQL容器


    #docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest #创建并启动一个MySQL容器

    # docker ps #查看容器运行状态

    mysql -uroot -proot #进入mysql

    若访问docker安装的mysql ,连接失败,则

    docker exec -ti 2cbb0f246353 /bin/bash #进入镜像中的mysql(ti 后面的字符串是mysql镜像ID)

    mysql -u root -p #登录mysql

    常用命令

    1、镜像命令

    docker images:列出本地所有镜像

    docker images -a:列出所有本地镜像,且包含中间层,比如你pull了一个tomcat镜像,实际上还会pull例如centos镜像等很多中间层的镜像

    docker images -q:只列出镜像ID

    docker search tomcat:从docker hub上查询镜像

    docker pull tomcat:拉取镜像

    docker rmi tomcat:删除本地镜像

    docker rmi -f tomcat nginx centos:强制删除多个本地镜像

    docker rmi -f $(docker images -q):类似于linux的管道,删除$表达式里的东西,也就是删除所有本地镜像

    2、容器命令

    docker run [OPTION] image [COMMAND] [ARGS]

    docker run -it --name mycentos centos:启动容器,-i的意思是以交互模式运行容器,-t的意思是为容器重新分配一个终端,-i、-t常常同时使用

    docker ps:列出所有正在运行的容器

    docker ps -a:列出曾经和正在运行的容器

    exit:容器停止并退出(如果你是以-it的方式启动容器并进入容器自己建的终端的话)

    ctrl+P+Q:容器不停止并退出

    docker start 容器ID:启动曾经运行过的容器

    docker kill(或stop或restart) 容器ID:kill是强制关闭容器,等于断电,stop也是关闭容器,不过相当于正常关机

    docker rm 容器ID:删除容器

    docker rm -f 容器ID:强制删除

    dokcer rm -f $(docker ps -a -q):全部删除

    docker ps -a -q | xargs docker rm:全部删除

    docker run -d centos:后台启动容器,注意,后台启动容器的话必须有一个前台进程,不然容器会直接自动关闭,也就是说如果只运行docker run -d centos的话容器会自己停止,因为centos镜像启动后没有一个前台进程,我们可以添加docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 2;done",这样会有一个前台进程循环输出helloworld,容器就不会自动停止了。

    docker logs -f -t --tail 容器ID:查看docker日志,-t是在日志里跟入时间戳,-f是跟随日志更新而更新,--tail+数字是显示最后数字行的日志。

    docker top 容器ID:查看容器内进程

    docker inspect 容器ID:查看容器细节

    docker attach 容器ID:重新进入正在运行的容器

    docker exec -t 容器ID ls -l  /temp:进入容器并执行ls -l /temp命令

    docker cp 容器id:/tmp/test.txt /root:把容器内/tmp/test.txt复制到宿主机的/root下

    docker run -p 宿主机端口:容器内端口:将容器内端口映射到宿主机的指定端口上

    docker run -d /mnt/mfs/data:/tmp/data:添加容器数据卷,简单的说,就是将宿主机的/mnt/mfs/data和容器内的/tmp/data路径下的文件、文件夹同步

    创建镜像

    除了从Docker hub上下载镜像,也可以创建一个镜像,创建镜像有两种方法,一是使用docker commit命令,二是使用docker build命令和Dockerfile文件。这里我们说的创建镜像是指基于一个已有的基础镜像比如ubuntu等,而不是从零创建一个全新的镜像。

    第一种,使用docker commit创建。

    利用镜像启动一个容器==>进行修改 ==> 利用commit提交更新后的副本

    [root@xxx ~]# docker run -it centos:latest /bin/bash # 启动一个容器
    [root@72f1a8a0e394 /]# # 这里命令行形式变了,表示已经进入了一个新环境
    [root@72f1a8a0e394 /]# git --version # 此时的容器中没有git
    bash: git: command not found
    [root@72f1a8a0e394 /]# yum install git # 利用yum安装git
    ......
    [root@72f1a8a0e394 /]# git --version # 此时的容器中已经装有git了
    git version 1.8.3.1

    此时利用exit退出该容器,然后查看docker中运行的程序(容器):[root@xxx ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    72f1a8a0e394 centos:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago angry_hodgkin

    这里将容器转化为一个镜像,即执行commit操作,完成后可使用docker images查看:

    [root@xxx ~]# docker commit -m "centos with git" -a "qixianhu" 72f1a8a0e394 xianhu/centos:git

    [root@xxx ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    xianhu/centos git 52166e4475ed 5 seconds ago 358.1 MB
    centos latest 0584b3d2cf6d 9 days ago 196.5 MB

    其中,-m指定说明信息;-a指定用户信息;72f1a8a0e394代表容器的id;xianhu/centos:git指定目标镜像的用户名、仓库名和 tag 信息。注意这里的用户名xianhu,后边会用到。

    此时Docker引擎中就有了我们新建的镜像xianhu/centos:git,此镜像和原有的CentOS镜像区别在于多了个Git工具。此时我们利用新镜像创建的容器,本身就自带git了。

           

    第二种,使用docker build命令和Dockerfile文件创建。

    首先我们先创建一个空目录,作为构建环境,即Docker中的构建上下文:

    mkdir gcc   #新建一个目录

    cd gcc      #进入目录

    vim Dockerfile   #在该目录中创建一个Dockerfile文件

    在文件中编辑:

    #Version: 0.0.1
    FROM ubuntu:latest
    MAINTAINER buffoon xxx@gmail.com
    RUN apt-getinstall gcc 
    COPY ./* /usr/share/gitdir/   # 拷贝本地文件到镜像中(该句可以不添加)

    这个文件中,FROM 必须作为第一条指令,是指定基础镜像;MAINTAINER指令指明作者的一些信息;RUN 指明了镜像运行时要执行的命令。然后我们就可以进入到构建上下文中并执行创建:

    在 Dockerfile 文件的存放目录下,执行构建动作。

    cd gcc
    docker build -t=”gcc:v1” .  //(镜像名称:镜像标签)注意最后一个点号,. 代表本次执行的上下文路径,表明从当前路径中寻找Dockerfile文件。
  • 相关阅读:
    类例程_java战斗程序
    "类"的讲稿
    象棋中“车”的攻击范围_C#
    面向对象_方法_例题
    入门例子
    MyBatis
    MyBatis
    MyBatis
    Spring
    Hibernate学习
  • 原文地址:https://www.cnblogs.com/tester-l/p/6015220.html
Copyright © 2011-2022 走看看