5.0 docker的使用

一、概述

1. 简介

  Docker是一个开源的应用容器引擎,类似于虚拟机技术,但是不是虚拟机,是一个轻量级的容器技术,但是它却实现了虚拟机里面的资源隔离,它的性能远远高于虚拟机的

解释:

eg: Windows官网的系统是没有安装常用软件和配置的,这时,我们可以把Windows系统的常用软件以及驱动等安装好,然后打包成一个Windows镜像系统。如果别人需要安装系统时,直接安装这个镜像系统,里面就有常用的软件以及驱动了。docker类似于这种机制,虽然它们完全不是一个东西,但是思路一致。比如,在我们开发和运维的过程中,我们经常需要在linux服务器上安装各种环境mysql、redis、tomcat等,这时可以使用docker将已经安装配置好的软件可以打包成一个镜像,比如mysql已经在第一个linux上面安装并配置好了,可以把它打包成一个镜像。这样,别人如果想要给他的linux服务器里面安装mysql,那只要他的linux服务上安装了docker,他就可以用这个docker将之前打包好的mysql镜像直接放在他的服务器里面,运行镜像就可以了,只要运行起来这个镜像(运行起来的镜像我们称为一个容器),比如mysql镜像一运行起来就有mysql容器,mysql就是在它的mysql容器中运行。打包的redis镜像在别的服务器运行就来,它就是redis容器,它在自己的容器里面运行。每一个容器之间它是沙箱的隔离机制。这样的话,想要在其他的linux服务器安装mysql、redis环境,只需要安装一次打包好镜像,在其他服务器里面运行镜像就可以了,不用在每一个服务器里面都安装。
View Code

Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。

运行中的这个镜像称为容器,容器启动是非常快速的。

 

2. 核心概念

沙箱机制(Sandboxie)沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响。

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上,只要在你的机器上安装了docker程序,

                         你的机器就称之为docker主机,不管是你的本机,还是在你的远程机器);

docker客户端(Client):连接docker主机进行操作(客户端通过命令行或者其他工具使用docker,类似于mysql的客户端和mysql服务器);

docker仓库(Registry):用来保存各种(使用docker)打包好的软件镜像(docker有公用仓库Docker hub,你也可以自己搭建私人仓库);

docker镜像(Images):软件打包好的镜像,放在docker仓库中(以后要安装软件时,去docker仓库中,将我们要安装的镜像下载到本机,

    然后直接用docker的命令运行mysql镜像,之后会产生/启动mysql容器,msyql容器就像我们启动了一个mysql).

    应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。

镜像:是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用;

    image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。

如想要在我们的机器上安装5个tomcat, 下载到tomcat镜像,将这个镜像运行上5次,每一次都是都会生成一个容器,这样就有

5个tomcat容器,就模拟了5个tomcat,只对容器的启动停止,就是tomcat的启动停止。

二、使用步骤

1. 使用Docker的步骤

(1)安装Docker

(2)去Docker仓库找到这个软件对应的镜像(eg:mysql);

(3)使用Docker运行这个镜像(mysql),这个镜像就会生成一个Docker容器(这个容器就代表当前正在运行的镜像,比如tomcat镜像,一运行生成tomcat容器);

(4)对容器的启动停止就是对软件的启动停止;

配置镜像加速:(国外的太慢)

阿里云镜像加速:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

vim /etc/docker/daemon.json  你可能没有这个文件,但是这并不影响

在文件中加入(阿里云镜像):{ "registry-mirrors": ["https://wjfi17tc.mirror.aliyuncs.com"] }

sudo systemctl daemon-reload

sudo systemctl restart docker  重启docker服务

2. 安装Docker

1)安装linux虚拟机

1)VMWare、VirtualBox(安装);

2)导入虚拟机文件centos7-atguigu.ova;

3)双击启动linux虚拟机;使用 root/ 123456登陆

4)使用客户端连接linux服务器进行命令操作;

5)设置虚拟机网络;

桥接网络===选好网卡====接入网线;

6)设置好网络以后使用命令重启虚拟机的网络

service network restart

7)查看linux的ip地址:

  ip addr

8)使用客户端连接linux;

2)在linux虚拟机上安装docker

步骤:

1、检查内核版本,必须是3.10及以上
  uname -r
2、安装docker
  yum install docker
3、输入y确认安装
4、启动docker
  systemctl start docker  //restart 重先启动
  docker -v
5、开机启动docker
  systemctl enable docker
6、停止docker
  systemctl stop docker

3. Docker常用命令&操作

3.1 镜像操作

操作   命令             说明
检索   docker search 关键字      eg:docker search redis 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。  参考:图1
拉取   docker pull 镜像名:tag      :tag是可选的,tag表示标签,多为软件的版本,默认是latest (最新的)
列表   docker images        查看所有本地镜像 ,参考图2
删除   docker rmi image-id       删除指定的本地镜像

docker仓库

3.2 容器操作

软件镜像(QQ安装程序)---->运行镜像---->产生一个容器(正在运行的软件,运行的QQ);

以后如果还有装qq,那么只需要运行镜像就可以了,镜像只需要一个。

步骤:

1、搜索镜像
  docker search tomcat
2、拉取/删除 镜像
  docker pull tomcat
 docker rmi 镜像id //删除指定镜像
 docker rmi $(docker images -q) //删除所有镜像
3、根据镜像启动容器
// --name: 自定义容器名 -d: 后台运行 tomcat:latest是要运行的镜像名:版本号
 docker run --name mytomcat -d tomcat:latest
 // -p:将主机的端口映射到容器的一个端口上
 docker rum -d -p 8888:8080 tomcat
3.1 进入正在运行的容器并以命令行交互
 docker exec -it 容器ID bashShell // eg: bashShell /bin/bash 在容器中打开新的终端,并且可以启动新的进程
 docker attach 容器ID //attach 直接进入容器启动命令的终端,不会启动新的进程(重新进入)
4、查看运行中的容器  docker ps eg: docker ps --format "table {{.ID}} {{.Image}} {{.Names}} " 表示显示指定的字段 可参考附录1
docker ps -a  //查询所有容器,包括未运行的 5
、启动、停止、删除容器  docker stop  容器的id  //停止正在运行中的容器
 docker start 容器id //启动容器,也可以是容器的name
docker rm 容器id eg: docker rm -f 4b88132f957e -f是强制删除的意思,在无法正常停止的时候使用
docker rm -f $(docker ps -q) //批量删除运行着的容器 -f是强制删除 -q是container id 
6、查看容器内部细节
 docker inspect 容器ID

 8、退出容器
   exit //容器停止并退出   

   ctrl+P+Q //容器不停止退出

  9、docker清理命令
  docker kill $(docker ps -a -q) //杀死所有正在运行的容器 -q:只显示容器编号
  docker rm $(docker ps -a -q) //批量删除所有已经停止的容器
  docker rmi $(docker images -q -f dangling=true) //删除所有未打标签的镜像

10、为了演示简单关闭了linux的防火墙
  service firewalld status ; // 查看防火墙状态
  service firewalld stop // 关闭防火墙
11、查看容器的日志
  docker logs container-name/container-id
12、从容器内拷贝文件到主机上(从宿主机内拷贝文件到容器,则通过数据挂载的方式)
  docker cp  容器ID:容器内路径 目的主机路径
  docker cp host_path containerID:container_path //从主机复制到容器
更多命令参看 https:
//docs.docker.com/engine/reference/commandline/docker/ (英文网) docker命令大全

3)、安装MySQL示例

docker pull mysql

 错误的启动

[root@localhost ~]# docker run --name mysql01 -d mysql
42f09819908bb72dd99ae19e792e0a5d03c48638421fa64cce5f8ba0f40f5846

mysql退出了
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
42f09819908b        mysql               "docker-entrypoint.sh"   34 seconds ago      Exited (1) 33 seconds ago                            mysql01
538bde63e500        tomcat              "catalina.sh run"        About an hour ago   Exited (143) About an hour ago                       compassionate_
goldstine
c4f1ac60b3fc        tomcat              "catalina.sh run"        About an hour ago   Exited (143) About an hour ago                       lonely_fermi
81ec743a5271        tomcat              "catalina.sh run"        About an hour ago   Exited (143) About an hour ago                       sick_ramanujan


//错误日志
[root@localhost ~]# docker logs 42f09819908b
error: database is uninitialized and password option is not specified 
  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD;这个三个参数必须指定一个

正确的启动

[root@localhost ~]# docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
b874c56bec49fb43024b3805ab51e9097da779f2f572c22c695305dedd684c5f
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b874c56bec49        mysql               "docker-entrypoint.sh"   4 seconds ago       Up 3 seconds        3306/tcp            mysql01

做了端口映射

[root@localhost ~]# docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
ad10e4bc5c6a0f61cbad43898de71d366117d120e39db651844c0e73863b9434
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ad10e4bc5c6a        mysql               "docker-entrypoint.sh"   4 seconds ago       Up 2 seconds        0.0.0.0:3306->3306/tcp   mysql02

mysql以3307端口启动:docker run -p 3307:3306 --name mysq3307 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7  [参考]

几个其他的高级操作

docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag
把主机的/conf/mysql文件夹挂载到 mysql docker容器的/etc/mysql/conf.d文件夹里面
改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)

mysql其他常用参数: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci //指定编码
--lower_case_table_names=1  //表名不区分大小写 --restart=always //开机自动启动

附录:

附录1:

docker ps 默认的显示内容过多,当值过长时就会导致折行,可读性很差,所以希望只显示自己关心的某些列。

可以自己指定显示的模板,例如:
docker ps --format "table {{.ID}} {{.Image}} {{.Names}} "


附图说明:

图片仓参考区:此部分作为上面的补充说明

图1:

docker search mysql:搜索镜像的命令

index:索引名称;

name:这是镜像名字,只有写"docker.io/:后面的部分就可以;

description:镜像的描述;

stars:有多少人关注了这个镜像,单位为k(千人);

official:是不是mysql官方发布的镜像,官方的没有帮我们做一些自动配置,我们可以自定义配置;

automa:是不是自动构建的,如果写了ok,说明这个镜像是自动化的,我们只要一运行,所有的配置都帮我们配置好了;

图2:

docker images:查看本地所有镜像

repository:从哪里下载的镜像
tag:标签
image_id:镜像id
created:这个镜像是被什么时候创建的
size:镜像大小

参考: 沙箱机制

原文地址:https://www.cnblogs.com/shiyun32/p/10874866.html