docker


Docker

参考文章

1 Docker介绍

Docker是当下使用最多的一种容器技术,docker对于专门的运维人员要求较高,开发人员也是要适当的学习下。

Docker中最重要的三个概念:仓库、镜像、容器。

  • 镜像(Image),即将jdk+项目jar包等文件以Docker的形式打包在一起就是镜像。类似系统镜像
  • 容器(Container),将镜像实例化启动起来,就形成了容器。容器是一个轻量化的Linux系统,root用户权限、进程空间、用户空间和网络空间都有。
    • 比如需要部署一个redis,在linux系统中需要下载、安装、配置环境变量,而在docker中只需要将做好的redis镜像下载运行起来称为一个轻量级的linux,就直接拥有了redis环境。(类似win系统镜像中的自带软件)
  • 仓库(Repository):仓库用于存放Docker镜像,类似GitHub存放代码的仓库;仓库可以供用户pull
    1. 通过pull命令获取docker hub上的镜像,如mysql、redis等
    2. 将拉取的镜像在本地run起来,称为容器
    3. 如果需要自己构建一个镜像时,要在springboot项目中使用build命令构建

img

2 Docker安装

参考文章:https://www.cnblogs.com/kingsonfu/p/11576797.html

拥有一台Linux系统,并连接到Linux系统。

2.1 Ubuntu中安装docker

  1. 切换至root用户下,否则权限不够: sudo su
  2. 更新apt-get,保证apt-get最新版本: apt-get update
  3. 安装docker: apr-get install -y docker.io
  4. 安装完成后查看docker版本: docker version
  5. 启动docker服务: service docker start (已经运行后再次执行也不会报错)
  6. 再次执行 docker version 可以查看是否启动成功
    • 如果有Clinet和Service说明启动成功了

2.2 CentOS中安装docker

  • CentOS7安装docker要求系统为64位,内核版本为3.10以上,查看内核版本: uname -r

  • 如果存在旧版本docker,则先卸载后重新安装(使用卸载成功)

    # 1、查看安装过的docker:
    yum list installed | grep docker
    docker.x86_64                      2:1.13.1-74.git6e3bb8e.el7.centos
    docker-client.x86_64               2:1.13.1-74.git6e3bb8e.el7.centos
    docker-common.x86_64               2:1.13.1-74.git6e3bb8e.el7.centos
    # 2、卸载docker:(删除安装包命令:yum remove docker,功能类似) 
    sudo yum remove -y docker-ce.x86_64 docker-client.x86_64 docker-common.x86_64
    # 3、删除容器镜像:
    sudo rm -rf /var/lib/docker
    # 4、 再次查看安装过的docker,显示不存在
    # 5、 重新安装docker
    sudo yum install docker-ce
  • 使用docker仓库进行安装(虚拟机安装成功)

    1. 安装依赖包: sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    2. 配置镜像源
      • 官方地址(慢):sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      • 阿里云镜像:sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      • 清华大学源:sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
    3. 安装docker-ce: sudo yum install docker-ce
    4. 启动docker服务:sudo systemctl start docker 开机自启:sudo systemctl enable docker image-20210605173038139
    5. 查看docker服务运行状态:sudo systemctl status docker
    6. 使用hello-world镜像命令验证docker是否可用:docker run hello-world (如果不存在该镜像会自动从远程仓库拉取并运行) image-20210605172909117
  • 用yum源安装docker(同上一种安装方式)

    1. 查看是否存在已安装的docker列表: yum list installed | grep docker
    2. 使用yum命令安装docker: yum -y install docker (-y表示不询问安装)
    3. 安装完成后再次使用 yum list installed | grep docker 查看安装列表
    4. 使用命令启动docker服务: systemctl start docker
    5. 命令查看docker服务状态: systemctl status docker
    6. 如图所示表示docker服务安装并启动成功:img
  • 使用官方安装脚本自动安装

    • 安装命令为:curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
    • 或国内daocloud安装命令:curl -sSL https://get.daocloud.io/docker | sh
  • 离线安装docker

    1. 通过 wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz 下载docker或 点击下载 至本地,再使用ftp工具上传服务器。

    2. 使用命令解压docker包:tar -zxvf docker-18.06.3-ce.tgz

    3. 将解压文件复制到 /usr/bin/ 目录下: cp docker/* /usr/bin/

    4. /etc/systemd/sysgtem/ 下新增docker.service文件,添加如下内容,将docker.service注册为服务

      [Unit]
      Description=Docker Application Container Engine
      Documentation=https://docs.docker.com
      After=network-online.target firewalld.service
      Wants=network-online.target
      
      [Service]
      Type=notify
      # the default is not to use systemd for cgroups because the delegate issues still
      # exists and systemd currently does not support the cgroup feature set required
      # for containers run by docker  #设置域名访问权限
      ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
      ExecReload=/bin/kill -s HUP $MAINPID
      # Having non-zero Limit*s causes performance problems due to accounting overhead
      # in the kernel. We recommend using cgroups to do container-local accounting.
      LimitNOFILE=infinity
      LimitNPROC=infinity
      LimitCORE=infinity
      # Uncomment TasksMax if your systemd version supports it.
      # Only systemd 226 and above support this version.
      #TasksMax=infinity
      TimeoutStartSec=0
      # set delegate yes so that systemd does not reset the cgroups of docker containers
      Delegate=yes
      # kill only the docker process, not all processes in the cgroup
      KillMode=process
      # restart the docker process if it exits prematurely
      Restart=on-failure
      StartLimitBurst=3
      StartLimitInterval=60s
      
      [Install]
      WantedBy=multi-user.target
    5. 修改docker.service文件权限:chmod +x /etc/system/docker.service 并进行服务的重载systemctl daemon-reload

    6. 命令启动docker服务: systemctl start docker

    7. (可选)设置docker服务为开机自启:systemctl enable docker.service

    8. 查看docker启动状态: systemctl status docker img

3 Docker使用

3.1 第一个Docker镜像

  1. 使用命令查看docker本地镜像信息:docker images
  2. 使用命令从远程仓库拉取指定镜像到本地: docker pull hello-world
  3. 使用run命令执行一个镜像: docker run hello-world
  4. 配置仓库拉取镜像时的加速器(docker hub是外网,拉取镜像时可能会网络超时,配置阿里云加速器)
  5. 登录阿里云 ,进行加速器的配置 配置加速器
  6. 使用命令配置镜像加速器 image-20210607123938501
    • 命令行换行输入使用:\+enter
    • <<-EOF之后回车会自动换行,直到最后EOF输入后执行所有语句
  7. 重新加载配置:sudo systemctl daemon-reload
  8. 重新启动docker服务:sudo systemctl restart docker
  9. 查看当前运行的容器信息:docker ps ,查看所有容器信息:docker ps -a
  10. docker中镜像运行方式
    1. 前台运行:docker run nginx ,显示当前运行状态,无法进行其他操作,使用ctrl+C停止
    2. 后台运行:docker run -d nginx ,-d即 –detach ,执行后返回容器id,使用ps查看当前运行的容器
  11. 使用命令结束容器运行:docker stop id (id一般使用前两位即可)

3.2 Nginx镜像

  1. 拉取nginx镜像
  2. 后台运行nginx并映射主机端口: docker run -d -p 8080:80 nginx
  3. 访问主机地址:端口,显示nginx主页:image-20210605203533170

3.3 容器化MySQL

可以在 阿里云镜像中心 搜索相关的镜像,会跳转到docker官网镜像处。

MySQL镜像使用步骤:

  1. 使用命令查询mysql镜像信息:docker search mysql
  2. 从远程仓库拉取mysql镜像,docker pull mysql
  3. 通过docker run 运行镜像
    • -d进行后台运行
    • -p指定mysql镜像映射的主机端口
    • -e后跟mysql的参数,来连接查询数据库的名称和连接密钥
  4. 如命令:docker run -d -p 3306:3306 -e MYSQL—_ROOT_PASSWORD=root -e MYSQL_DATABASE=datebase mysql:latest
    • 属性名称必须要大写,否则无效
    • -e MYSQL_ROOT_PASSWORD=root:设置 MySQL 服务 root 用户的密码为root
    • -e MYSQL_DATABASE=datebase ,创建一个名为databse的数据库
  5. 运行成功后,可以进入到mysql镜像中并查看mysql信息
    1. 使用docker ps 查看当前执行的镜像的ID,
    2. 使用命令进入到docker镜像中:docker exec -it 镜像ID bash ,进入后命令行前缀用户就变成了容器ID。
    3. 进入容器中,就相当于进入了一个轻量级Linux,命令是相同的
    4. 进入mysql镜像后,使用命令连接mysql:mysql --user=root --passwordmysql -h localhost -u root -p 然后输入密码登录

错误:服务器上通过docker命令运行和访问正常,但是使用navicate远程连接mysql时报错如下:image-20210605210755813

  • 首先通过mysql镜像的ID进入到镜像中,并连接mysql mysql -u root -p 输入密码

  • 开启远程访问权限

    • 查看数据库信息show databases;
    • 切换使用mysql数据库:use mysql;
    • 查询user表权限信息:select host,user from user
    • ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
    • 刷新操作:flush privileges;
    • 然后可以远程使用navicate连接了。
    • 原因:镜像中root用户已经有了远程连接的权限,但是模式不一样导致无法连接,因此要将root用户的密码改成 mysql_native_password 模式即可。

    img

问题: 每次运行mysql时使用命令创建数据库,当服务stop之后,数据库就没了,下次运行要重新创建?

  • 如果每次都重新run运行mysql镜像,那么每次启动后服务的ID是不同的,就是不同的服务,则数据库是一个原始的数据库
  • 而使用命令 docker ps -a 可以查看所有的服务,找到之前服务的ID,直接 docker start ID 可以运行已经存在的服务,且配置是一样的。image-20210606135102552

3.4 Docker安装Redis

4 Docker中网络设置

docker容器是一个小的linux,也就是一个虚拟机。容器想要跟外部进行交互,就只能先通过CentOS服务器主机的网卡,然后再与外界交互。docker容器与外部主机网络通讯的方式有三种:

  • 桥接(Bridge),最常用,将主机上的端口映射到docker容器的端口上,如8080:8081既是将主机上的8080端口映射到docker容器的8081端口
    • 桥接模式使用 -P-p 参数指定端口映射方式,如:-p 主机端口:容器端口 -P 则是使用随机的主机端口来映射docker端口。
    • 如命令 docker run -d -p 8080:80 nginx ,即后台执行nginx,使用主机8080端口映射docker中80端口。
    • docker run -d -P nginx ,即后台执行nginx,并使用主机随机端口来映射nginx对应的80端口
    • 映射并运行成功后,访问主机地址:主机端口就可以访问docker容器中运行的服务
  • 共享(Host),主机与docker容器共享同一个端口
  • 无网络(None),docker容器中没有网络,外界无法访问

5 Docker常用命令

  • 重启docker:systemctl restart docker
  • 关闭docker:systemctl stop docker

5.1 镜像操作

镜像即远程仓库中拉取的系统镜像

  • 搜索查询镜像:docker search mysql
  • 下载拉取镜像(最新):docker pull mysql:latest
  • 查看、删除本地镜像
    • 查看本地镜像:docker images
    • 删除本地镜像:docker rmi <image id>
    • 删除全部镜像:docker rmi $(docker images -q)
    • 如果镜像因为关联而无法删除,可以使用-f参数强制删除:docker rmi -f $(docker images -q)

5.2 容器操作

容器是将拉取的镜像执行后生成的服务

  • 运行指定容器服务:docker start <容器名/ID> ,如 docker run mysql
    • 后台运行容器服务:docker run -d mysql
    • 后台运行并端口映射:docker run -d -p 3306:3306 mysql
    • 映射 120.0.0.1:3306:3306 不指定主机端口时映射到随机端口;主机地址默认为0.0.0.0
    • 重启指定容器:docker restart <容器名/ID>
  • 查看进程(正在运行的容器):docker ps
    • 查看所有容器,包括已经停止的:docker ps -a
  • 停止、杀死、删除指定容器
    • 停止指定容器:docker stop <容器名/ID>
      • 停止所有容器:docker stop $(docker ps -a -q)
    • 杀死指定容器:docker kill <容器名/ID>
    • 删除容器:docker rm <容器名/ID>
      • 删除所有容器:docker rm $(docker ps -a -q)
    • 关闭docker中的mysql容器服务:docker stop mysqlserver/ID
    • 重启docker中的mysql服务:docker restart ID
  • 查看容器日志:docker logs -f <容器名/ID>
    • 查看docker中指定容器的前10条日志信息:docker logs -f --tail 10 ID
  • 进入到docker镜像
    • sudo docker attach <image id>,该命令在多端使用时会同步阻塞,不太适合生成环境
    • 可以安装ssh Server后使用ssh连接进入,但是没有必要
    • 安装nsenter后使用命令,使用比较繁琐
    • docker 1.3.x之后提供了exec命令进入容器,sudo docker exec -it <image id> /bin/bash

6 制作Docker镜像

将自己的springboot项目制作成为镜像,需要:

  1. 将项目打为jar包

  2. 服务器获取项目的jar包(可上传至git上,然后使用get clone来远程获取)

    • git clone https://gitee.com/chaitou/hello-springboot
    • 前提是服务器linux中已经安装了git
  3. 进入到项目jar包中,并在同级目录下编写dockerfile文件

    • cd hello-springboot

    • vim Dockerfile

      • # 依赖的基础镜像
        from java:8
        # 创建者
        MAINTAINER bugpool xxx@163.com
        # 将当前目录下的jar复制到容器/目录下
        COPY hello-springboot.jar /hello-springboot.jar
        # 指定启动时运行java -jar 命令
        ENTRYPOINT ["java", "-jar","/hello-springboot.jar"]
  4. 拉取java镜像以满足项目运行环境

    • docker pull java:8
  5. 使用 docker build来构建镜像,将springboot构建为本地镜像

    • docker build -t hello-springboot:1.0 .
    • -t指明了镜像名和版本号;点号代表当前目录
  6. 启动构建的镜像,并使用-p来映射主机端口

    • docker run -p 80:8080 hello-springboot:1.0
  7. 可以通过主机地址:80端口+项目接口地址/hello来访问


文章作者: shone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 shone !
评论
 上一篇
Hexo博客中增加导航页面 Hexo博客中增加导航页面
Hexo中使用matery主题创建导航页面 Hexo博客中增加导航页面1. 切换博客主题在学习的过程中,发现Hexo博客当前的landscape主题扩展性不够,没有找到添加导航页的方法;与之相比,matery主题在众多大佬的不断调教
2021-10-03
下一篇 
Hexo使用Next主题的优化策略 Hexo使用Next主题的优化策略
Next主题进阶使用学习。 1.设置头像边框为圆形和旋转特效自己设置: 系统自带:next已经内置了可以调节的功能,只需要将开关打开即可 2.本地搜索根目录下使用git命令:npm install hexo-generato
2021-03-19
  目录