• Docker从了解到部署应用的详细教程


    一、Docker基础知识

    1、Docker

    (1)Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可以移植的容器中,然后发布到任何的linux机器上,可以实现虚拟化;
    (2)Docker容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低;

    2、Docker的应用场景

    (1)Web应用的自动化打包和发布;
    (2)自动化测试和持续集成、发布;
    (3)在服务型环境中部署和调整数据库或其他的后台应用;

    3、Docker的优点

    (1)快速一致地交付应用程序:Docker 允许开发人员使用提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期;
    (2)响应式部署和扩展:Docker 是基于容器的平台,允许高度可移植的工作负载;
    (3)在统一硬件上运行更多工作负载:Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情;

    4、简单的理解:

    (1)Docker与虚拟机的区别:

    docker共享主机的硬件资源,而虚拟机是独占一块硬件资源的:安装了虚拟机,占用2G内存,100G存储空间,运行程序时,就会占用这些资源,外部应用无法读取这些资源,但是Docker可以的。

    二、Docker的架构

    1、Docker中的三个基本概念:

    (1)镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统,比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统;
    (2)容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等;
    (3)仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像;
    (4)Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器;

    2、架构详解

    (1)架构图
    0
    (2)解析
    概念
    说明
    Docker 镜像(Images)
    Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统;
    Docker 容器(Container)
    容器是独立运行的一个或一组应用,是镜像运行时的实;。
    Docker 客户端(Client)
    Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信;
    Docker 主机(Host)
    一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
    Docker Registry
    Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
    Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
     
    Docker Machine
    Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

    三、安装Docker

    1、检查系统版本

    (1)linux内核要大于3.0,才可以使用docker(一般docker在linux系统下部署)
    1
    uname -r
    (2)查看当前操作系统的版本
    1
    cat /etc/os-release

    2、安装docker

    (1)卸载旧的docker版本(如果之前安装过docker,需要先卸载)
    1
    apt-get remove docker docker-engine docker.io containerd runc
    (2)允许apt命令可以使用https访问Docker repository
    1
    apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    (3)添加Docker官方的GPGkey
    1
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    (4)验证key(搜索后8位即可显示完成的密钥)
    1
    apt-key fingerprint 0EBFCD88
    (5)设置repository版本位stable并更新软件列表
    1
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt-get update 
    (6)开始安装docker
    1
    apt-get install docker-ce docker-ce-cli containerd.io
    (7)查看docker版本
    1
    docker --version sudo docker version
    (8)docker换源
    原因:docker服务器在国外,在平常使用docker下载镜像的过程中,难免会导致下载很慢的情况,可以将docker换成阿里源,这样下载就快很多了。
    登录阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 按照官方教程操作
    0
    1
    sudo mkdir -p /etc/docker
    sudo tee
    /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://0orggnrc.mirror.aliyuncs.com"] } EOF
    重启docker
    sudo systemctl daemon
    -reload
    sudo systemctl restart docker

    3、docker的其他命令

    (1)启动docker服务
    1
    systemctl start docker sudo service docker start
    (2)查看docker是否开启
    1
    sudo systemctl status docker
    (3)设置docker开机自动启动
    1
    sudo systemctl enable docker
    (4)重启dockers
    1
    systemctl restart docker sudo service docker restart
    (5)关闭docker服务
    1
    sudo service docker stop systemctl stop docker
    (6)删除docker
    1
    2
    3
    4
    1)删除安装包
    apt remove docker-ce
    2)删除镜像、容器、配置文件等内容
    rm -rf /var/lib/docker

    四、Docker的运行

    1、Docker允许在容器内运行应用程序,使用docker run 命令行来在容器内运行一个应用程序

    1
    docker run ubuntu:15.10 /bin/echo "Hello world"
    0
    (1)参数说明
    • docker:Docker的二进制执行文件;
    • run:与前面的 docker 组合来运行一个容器;
    • ubuntu:15.10指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像;
    • /bin/echo "Hello world": 在启动的容器里执行的命令;
    以上命令解释:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

    2、交互式容器

    (1)命令行
    1
    docker run -i -t ubuntu:15.10 /bin/bash
    (2)参数:
    • -t: 在新容器内指定一个伪终端或终端;
    • -i: 允许你对容器内的标准输入 (STDIN) 进行交互;
    如下截图我们已经进入到Ubuntu15.10容器系统
    0
    (3)退出容器
    1
    CTRL + D/exit

    3、启动容器(后台运行)

    1
    docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    0
    输入如上命令,输出的结果为一串长字符,是容器ID,我们可以通过容器ID来查看对应的容器发生了什么

    4、查看docker中容器的运行状态

    (1)命令行

    1
    docker ps -a
    (2)参数详情:
    • CONTAINER ID: 容器 ID;
    • IMAGE: 使用的镜像;
    • COMMAND: 启动容器时运行的命令;
    • CREATED: 容器的创建时间;
    • PORTS: 容器的端口信息和使用的连接类型(tcp\udp);
    • NAMES: 自动分配的容器名称;
    • STATUS: 容器状态;
    (3)状态枚举:
    • created(已创建)
    • restarting(重启中)
    • running 或 Up(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)

    5、宿主主机内查看容器标准输出

    (1)命令行
    1
    docker logs 容器ID docker logs 容器名字
    6、停止容器
    (1)命令行
    1
    docker stop 容器ID docker stop 容器名字

    五、基础命令

    1
    2
    docker
    docker stats --help

    1、容器的操作

    (1)如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
    1
    docker pull ubuntu
    (2)启动容器
    1
    docker run -it ubuntu /bin/bash
    (3)查看所有容器
    1
    docker ps -a
    (4)启动一个已经停止的容器
    1
    docker start 容器DI
    (5)后台运行:-d 指定容器的运行模式
    1
    docker run -itd --name ubuntu-test ubuntu /bin/bash
    (6)停止容器
    1
    docker stop 容器ID
    (7)重启容器
    1
    docker restart <容器 ID>
    (8)进入容器:使用-d参数时,容器启动后会进入后台,需要进入到容器,可以执行如下命令:
    1
    2
    3
    4
    1)docker attach: 如果从这个容器退出,会导致容器的停止;
    2)docker exec:推荐使用,因为此命令会退出容器终端,但不会导致容器的停止;
    3)更多参数说明请使用 docker exec --help 命令查看。
    docker attach 5b759546b0ad
    docker
    exec -it e79737bec76f /bin/bash
    0
    (9)导入和导出容器
    ①导出容器:如果要导出本地某个容器,可以使用 docker export 命令
    1
    docker export 容器ID > ubuntu.tar
    ②导入容器:可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
    1
    cat docker/ubuntu.tar(导出镜像的绝对路径) | docker import - test/ubuntu:v1

    (10)删除容器:删除容器使用 docker rm 命令:
    1
    docker rm -f 容器ID
    (11)下面的命令可以清理掉所有处于终止状态的容器
    1
    docker container prune

    六、镜像

    当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从Docker Hub公共镜像源下载。

    1、镜像的操作命令集合

    2、列出本地主机上的镜像:

    (1)命令
    1
    docker images
    (2)参数说明:
    • REPOSITORY:表示镜像的仓库源
    • TAG:镜像的标签
    • IMAGE ID:镜像ID
    • CREATED:镜像创建时间
    • SIZE:镜像大小
    (3)注意:
    • 使用 REPOSITORY:TAG 来定义不同的镜像
    • 如果不指定一个镜像的版本标签,docker 将默认使用 ubuntu:latest 镜像

    3、获取新的镜像

    1
    docker pull mysql:8

    4、查找镜像

    1
    2
    1)https://hub.docker.com/
    2)docker search 命令来搜索镜像 docker search mysql
    参数说明:
    • NAME: 镜像仓库源的名称
    • DESCRIPTION: 镜像的描述
    • OFFICIAL: 是否 docker 官方发布
    • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
    • AUTOMATED: 自动构建
    0

    5、删除镜像

    1
    2
    --删除镜像使用rmi,i是指images
    docker rmi hello-world

    6、创建镜像

    (1)下载镜像
    1
    2
    当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行
    1)从已经创建的容器中更新镜像,并且提交这个镜像
    2)使用 Dockerfile 指令来创建一个新的镜像

    (2)更新镜像
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    1)在如上的图中,创建了一个容器,接下来在运行的容器中更新
    apt-get update
    2)退出容器
    3)此时,容器ID为()的容器,是按照我们的需求更改的容器,可以通过docker commit 来提交容器副本
    docker commit -m='ubuntu15.10 has update' -a='runoob' 7d2a07d3e466 runoob/ubuntu:V2
    参数说明:
    -m:提交的描述信息
    -a: 指定镜像作者
    e218edb10161:容器 ID
    runoob/ubuntu:v2:指定要创建的目标镜像名
    4)使用新镜像启动一个容器:
    docker run -t -i runoob/ubuntu:V2 /bin/bash
    (3)构建镜像
    ①使用docker build,从零开始创建一个新的镜像,需要创建一个Dockerfile,其中包含一组指令来告诉Docker如何构建镜像:
    Dockerfile文件内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FROM    centos:6.7
    MAINTAINER      Fisher "fisher@sudops.com"
     
    RUN     /bin/echo 'root:123456' |chpasswd
    RUN     useradd runoob
    RUN     /bin/echo 'runoob:123456' |chpasswd
    RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
    EXPOSE  22
    EXPOSE  80
    CMD     /usr/sbin/sshd -D
    ②构建镜像
    1
    docker build -t runoob/centos:6.7 /opt/docker

    ③参数说明
    • 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
    • 第一条FROM,指定使用哪个镜像源
    • RUN 指令告诉docker 在镜像内执行命令,安装了什么
    • -t :指定要创建的目标镜像名
    • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

    7、设置镜像标签

    (1)命令行
    1
    docker tag d07ea9ca8e85 runoob/centos:centos6.7

    七、Docker容器连接

    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或者-p参数来指定端口映射

    1、运行容器mysql并配置使得其他人可以连接

    (1)命令

     

    1
    docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

     

    (2)参数说明:
    • -p 3306:3306 :映射容器服务的3306端口到宿主机的3306 端口外部主机可以直接通过宿主机ip:3306 访问到 MySQL 的服务。
    • MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码
    (3)设置过程
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8
     
    docker ps
     
    docker exec -it 28f89b6538f9 bash
     
    mysql -u root -p
     
    输入密码
     
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH
    GRANT OPTION;
     
    FLUSH PRIVILEGES;
     
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass
    word' PASSWORD EXPIRE NEVER;
     
    alter user 'root'@'%' identified with mysql_native_p
    assword by '123456';
     
    FLUSH PRIVILEGES;
     
    使用自己电脑上的navicat连接mysql

    八、Docker仓库管理

    仓库(Repository)是集中存放镜像的地方

    1、关联

    (1)官网注册
    (2)登录和退出:
    需要输入用户名和密码,登录后就可以从 docker hub 上拉取自己账号下的全部镜像
    1
    2
    3
    4
    ①登录
    docker login
    ②退出
    docker logout
    (3)推送镜像:用户登陆后,可通过docker push命令将自己的镜像推送到dockers Hub
    1
    docker tag ubuntu:18.04 annona/ubuntu:18.04
    docker image ls
    docker push annona
    /ubuntu:18.04
    docker search annona
    /ubuntu

    九、docker数据卷的概念

    1、概念图

    0

    2、数据卷的默认位置

    1
    /var/lib/docker/volumes
    0

    3、可以自己你创建数据卷目录

    1
    docker volume create mulu_name
    0

    4、查看数据卷内容

    1
    docker volume inspect annona
    0

    5、查看有多少个数据卷

    1
    docker volume ls

    6、删除某一个数据卷

    1
    docker volume rm annona
    0

    十、在Docker中运行容器

    1、运行gogs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    docker pull gogs/gogs
    mkdir -p /var/gogs
    docker run --name=gogs -p 7777:22 -p 9999:3000 -v /var/gogs:/data/ gogs/gogs
    docker run -d --name=gogs -p 1002:22 -p 1008:3000 -v /var/gogs:/data gogs/gogs
    -d:后台运行
    -v:数据卷挂载, 用于将容器和数据分离
    gogs访问地址:
    -p:port1:port2--port1与port2是映射的,port2是容器开放给linux系统的端口,port1是linux系统开放给其他主机连接的端口
    http://192.168.95.129:1008/install

    2、运行jenkins

    1
    2
    3
    4
    5
    6
    7
    8
    #创建 jenkins_home 目录
    sudo mkdir /home/jenkins_home
    #设置该目录的所有者和所属的组,普通用户默认uid为1000, gid为1000,-R指遍及子目录
    sudo chown -R 1000:1000 /home/jenkins_home
     
    docker run -d --name jenkins2.138.4 -p 9090:8080 -p 50000:50000 --privileged=true -v /home/jenkins_home:/var/jenkins_home jenkins/jenkins:2.138.4
     
    http://192.168.95.129:9090/
     
  • 相关阅读:
    【单独介绍主从同步的原理】SYNC和PSYNC的对比、优缺点_Redis08
    Go-知识测试-Main测试
    官宣!苏州吴江开发区上线电子劳动合同平台
    Android 10开始不支持创建新的HIDL
    漏洞复现--时空智友企业流程化管控系统敏感信息泄露(POC)
    文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题
    中科大郑烇、杨坚老师《计算机网络-自顶向下方法》课程 第2章 应用层笔记
    代码随想录——图论一刷day05
    【整合】基于卷积神经网络CNN 的 cat、dog、panda 分类
    计算机毕设(附源码)JAVA-SSM基于的校园卡管理系统
  • 原文地址:https://www.cnblogs.com/Annona/p/17803077.html