zoukankan      html  css  js  c++  java
  • Docker

    Ubuntu 安装 Docker

    使用脚本自动安装

    在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:
    $ curl -fsSL get.docker.com -o get-docker.sh
    sh get-docker.sh --mirror AzureChinaCloud
    # 可能会出现 404 错误,请移步下面的特别说明
    //$ sudo sh get-docker.sh --mirror Aliyun
    
    执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。

    特别说明

    2018 年 7 月 21 日,貌似阿里云这边在做调整,故导致 Docker 的 Aliyun 安装脚本不可用,是永久性还是临时性的尚不清除,如果你已经按照之前的操作安装 Docker,请按以下步骤进行修复并重新安装
    • 如果已经使用了 Aliyun 脚本安装并成功的
      • 请先卸载 Docker,命令为:apt-get autoremove docker-ce
      • 删除 /etc/apt/sources.list.d 目录下的 docker.list 文件
    • 使用 AzureChinaCloud 镜像脚本重新安装,命令为:
    sudo sh get-docker.sh --mirror AzureChinaCloud
    

    测试 Docker 是否安装正确

    $ docker version
    
    能出现service和client
    

    Docker 镜像加速器

    Ubuntu 16.04+、Debian 8+、CentOS 7

    对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
    {
     "registry-mirrors": [
       "https://registry.docker-cn.com"
     ]
    }
    
    之后重新启动服务。
    $ systemctl daemon-reload
    $ systemctl restart docker
    

    检查加速器是否生效

    配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。
    Registry Mirrors:
     https://registry.docker-cn.com/
    

    Docker Compose 安装

    curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    
    注意,这里第一步可能下载不下来,需要从https://github.com/docker/compose/releases手动下载,把文件放到/usr/local/bin/目录下。

    卸载

    如果是二进制包方式安装的,删除二进制文件即可。

    $ sudo rm /usr/local/bin/docker-compose
    

    获取镜像

    从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
    docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
    
    • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
    • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
    比如:
    $ docker pull ubuntu:16.04
    
    上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:16.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜像。

    列出已下载的镜像

    docker images
    

    删除镜像

    docker rmi [选项] <镜像1> [<镜像2> ...]
    or
    docker image rm [选项] <镜像1> [<镜像2> ...]
    

    删除虚悬镜像

    docker image prune
    

    运行

    有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:16.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。
    $ docker run -it --rm 
        ubuntu:16.04 
        bash
    
    • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
    • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
    • ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
    • bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
    以交互的形式启动ubuntu:16.04容器,容器退出后随之将其删除,这里exit可以用快捷键 ctrl +D

    交互的形式进入容器

    docker exec -it
    

    查看正在运行的容器

    docker ps
    

    查看所有的容器

    docker ps -A
    

    删除容器

    docker rm
    docker rm -f 强制删除容器
    docker container prune 将所有未运行的容器删除
    

    停止容器

    docker stop 容器id
    

    重启容器

    docker restart 容器id
    

    守护进程

    docker run -p 8080:8080 --name tomcat -d tomcat
    
    docker run -p 8081:8080 --name tomcat1 -d tomcat
    
    此时启动两个Tomcat,分别的8080 和8081,对应宿主机的8080

    Dockerfile 定制镜像

    在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:
    cd /usr/local/
    
    mkdir docker
    
    mkdir tomcat
    
    $ vi Dockerfile
    

    其内容为:

    FROM tomcat
    //进入root文件夹
    WORKDIR /usr/local/tomcat/webapps/ROOT/
    //删除root文件夹所有内容
    RUN rm -fr *
    //写入index.html
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/local/tomcat/webapps/ROOT/index.html
    

    构建镜像

    $ docker build -t myshop .
    

    这里的 .是在指定上下文目录。 是打包当前目录,实际操作是把当前目录打包成一个压缩包,把压缩包以及docker build发送给服务端,服务端接受指令,解压该压缩包。解压出来的文件所在的目录称为上下文目录。这时docker images可以看到myshop镜像

    运行构建的镜像(tomcat)

    docker run -p 80:8080 myshop
    
    or
    
    docker run -P myshop
    
    宿主机的80端口映射到服务器的8080端口。EXPOSE 暴露端口,CMD 启动镜像中的程序。

    Dockerfile 指令详解

    Dockerfile COPY 复制文件

    格式:

    • COPY <源路径> <目标路径>
    切换到镜像目录的root文件夹
    WORKDIR /usr/local/tomcat/webapps/ROOT 
    
    删除该目录的全部文件
    RUN rm -fr *
    
    把项目拷贝到该目录,左边是上下文的文件路径,右边是镜像的目录
    COPY my-shop-admin.zip .
    
    解压传过去的压缩包
    RUN unzip my-shop-admin.zip
    
    解压完该压缩包就没有用了,所以解压完就把删了
    RUN rm -fr my-shop-admin.zip
    
    把工作目录切换到Tomcat
    WORKDIR /usr/local/tomcat
    

    数据卷

    主要用于数据持久化

    Docker 构建 tomcat

    可以共享宿主机资源,数据存在宿主机,这样如果容器删除了,数据并不会丢失
    docker run -p 8080:8080 --name tomcat -d -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat
    
    查看数据卷
    docker volume ls
    
    查看容器tomcat日志的方式
    docker logs tomcat
    
    • -p 8080:8080:将容器的8080端口映射到主机的8080端口
    • -v -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat:将主机中当前目录下的ROOT挂载到容器的/ROOT
    这里是一守护态(-d)启动一个端口为8080的tomcat,(-v)左边是宿主机资源的位置,右边是容器中资源的位置。Tomcat举例:
    • 如果宿主机的/usr/local/docker/tomcat/ROOT中只有一个index.html。容器中/usr/local/tomcat/webapps/ROOT目录下的文件也
      只有一个index.html。
    • 如果再创建一个tomcat1,共享root,tomcat1中的root也有index.html,由此实现资源共享。
    此时只要把项目拷贝到宿主机的tomcat ROOT目录,便可以实习持久化保存。比如:
    cp myshop.zip ROOT/
    cd ROOT
    unzip myshop.zip
    

    Docker 构建 mysql

    拉取官方镜像
    docker pull mysql:5.7.22
    
    运行容器
    docker run -p 3306:3306 --name mysql 
    -v /usr/local/docker/mysql/conf:/etc/mysql 
    -v /usr/local/docker/mysql/logs:/var/log/mysql 
    -v /usr/local/docker/mysql/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=123456 
    -d mysql:5.7.22
    

    注意,此时mysql的配置并没有生效,所以我们需要把mysql的配置持久化到数据卷

    • 删除掉之前的容器,重新创建一个容器,此时先不带第二行的配置
    docker rm -f mysql
    
    docker run -p 3306:3306 --name mysql 
    -v /usr/local/docker/mysql/logs:/var/log/mysql 
    -v /usr/local/docker/mysql/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=123456 
    -d mysql:5.7.22
    
    • 以交互的形式进入容器
    docker exec -it mysql bash
    
    • 进入容器中的/mysql.conf.d发现是有配置的,这里面的mysqld.cnf配置文件需要追加一条"max_allowed_packet = 128M"
    cd /etc/mysql/mysql.conf.d/
    
    • 回到容器的上级mysql目录
    cd ..
    
    • 进入mysql的conf.d文件夹,发现有cat mysqldump.cnf配置
    cd conf.d
    
    • 打印mysqldump.cnf,把它的配置复制出来
    cat mysqldump.cnf
    
    "max_allowed_packet	= 128M"
    
    • 重新进入容器的mysql.conf.d/文件夹
    cd /etc/mysql/mysql.conf.d/
    
    • 在mysqld.cnf的最后面追加之前复制的 "max_allowed_packet= 128M"
    echo "max_allowed_packet= 128M" >>mysqld.cnf
    
    • ctrl D 退出容器,重启容器,此时初始数据128m内的数据库便可以导入了
    docker restart mysql
    
    • 因为配置是放在容器中,并没有实现持久化,所有此时我们需要把容器中的配置拷贝到宿主机中,在重新根据数据卷的配置创建容器,实现数据持久化
      查看容器中配置的存放位置
    docker exec -it mysql bash
    cd /etc/mysql/
    pwd
    
    • 先进入到宿主机的conf文件夹,然后拷贝mysql容器中的/etc/mysql目录到宿主机的conf文件夹
    docker cp mysql:/etc/mysql .
    
    • 进入宿主机的conf/mysql目录,把复制下来的所有配置文件移动到上级conf目录,删除空白的mysql文件夹
    cd mysql
    mv *.* ..
    rm -fr mysql
    
    • 删除容器,重新运行容器,这次运行的是带有配置的
    docker rm -f mysql
    
    docker run -p 3306:3306 --name mysql 
    -v /usr/local/docker/mysql/conf:/etc/mysql 
    -v /usr/local/docker/mysql/logs:/var/log/mysql 
    -v /usr/local/docker/mysql/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=123456 
    -d mysql:5.7.22
    

    Docker Compose 使用

    Docker Compose 安装

    curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    
    注意,这里第一步可能下载不下来,需要从https://github.com/docker/compose/releases手动下载,把文件放到/usr/local/bin/目录下。

    卸载

    如果是二进制包方式安装的,删除二进制文件即可。

    $ sudo rm /usr/local/bin/docker-compose
    
    • 编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件
    cd /usr/local/docker/
    mkdir mywebsite
    cd mywebsite/
    vi docker-compose.yml
    
    version: '3'
    services:
      web:
        restart: always
        image: tomcat
        container_name: web
        ports:
          - 8080:8080
        volumes:
          - /usr/local/docker/mywebsite/ROOT:/usr/local/tomcat/webapps/ROOT
    
      mysql:
        restart: always
        image: mysql:5.7.22
        container_name: mysql
        ports:
          - 3306:3306
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: 123456
        command:
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
          --explicit_defaults_for_timestamp=true
          --lower_case_table_names=1
          --max_allowed_packet=128M
          --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
        volumes:
          - mysql-data:/var/lib/mysql
    
    volumes:
      mysql-data:
    
    此时的数据库文件在 cd /var/lib/docker/volumes下
    • 查看数据卷
    docker volume ls
    出现
    local               mywebsite_mysql-data
    
    • 启动
    docker-compose up
    //守护态运行
    docker-compose up -d
    
    • 删除
    docker-compose down
    
    • 看日志
    docker-compose logs tomcat
    //监听
    docker-compose logs -f tomcat
    
  • 相关阅读:
    课程总结
    2018-2019-2 20189205《移动平台应用开发实践》第一周作业
    2019年3月3日 2018-2019-2 20189205《移动平台应用开发实践》第二周作业
    2018-2019-2 20189205《移动平台应用开发实践》第十二周作业
    2018-2019-2 20189205《移动平台应用开发实践》第十一周作业
    项目代码分析
    2018-2019-2 20189205《移动平台应用开发实践》第十周作业
    博客分工
    2018-2019-2 20189205《移动平台应用开发实践》第九周作业
    2018-2019-2 20189205《移动平台应用开发实践》第八周作业
  • 原文地址:https://www.cnblogs.com/faramita/p/11306085.html
Copyright © 2011-2022 走看看