Docker 基本概念


文章目录

  • Docker 基本概念
  • 前言
  • 1、简介
  • 2、核心概念
  • 3、安装Docker
  • 1)、安装linux虚拟机
  • 2)、在linux虚拟机上安装docker(下面安装和测试基于centos7)
  • 4、Docker常用命令&操作
  • 1)、镜像操作
  • 2)、容器操作
  • 3)、安装MySQL示例
  • 如何挂载目录:
  • mysql8.0加密方式的兼容:(如果在my.cnf中指定了,可以略过)

  • 后记


前言

今天,当开发者创建一个应用,我们要发布到各种环境之下,本地环境、公共环境甚至是虚拟机的环境下。不同的服务器和环境下,存在不同的依赖关系。应用、服务、硬件所动态产生的差异排列组合,让开发者抓狂。我们怎么解决这个问题? 全球物流运输是个很好的参照物。标准尺寸的集装箱,让全球贸易效率大大提高。以某种程度来说,Docker可以被看做一个代码方面 的集装箱综合运输系统。

1、简介

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;

Docker 能让任何的应用和它的依赖打包成为一个轻量级的,便携的,独立的一个集装箱(镜像)。集装箱有标准的运作模式,因此可以方便自动化。他们被设计成能跑在几乎所有LINUX服务器上的容器。一个开发者在笔记本上建立和测试的一个Docker容器,能跑在测试环境、生产环境、虚拟机、新买的服务器、OpenStack集群、公共环境、或者是以上的组合的服务器群上。

运行中的这个镜像称为容器,容器启动是非常快速的。正如docker官网的这张图,docker运行在操作系统之上,在docker中可以启动各种容器,可以是tomcat,mysql,rabbitmq,redis 等等。




docker运行命令指定java启动堆参数命令_分布式


windows镜像方便了我们给多个电脑配置环境。类似的,docker通过镜像让我们很方便在不同主机上,通过简单的命令就可以搭建常用的开发环境,比如tomact,mysql 等等,并且各个应用容器启停方便迅速,而且安装时有版本控制,保证了各个机器的环境一致,极大简化开发中环境带来的问题,让开发者把精力放在重要的业务上。

Mysql连同相关的配置,就可以打包成一个MySQL-Docker镜像,然后在有docker环境的机器上运行产生一个MySQL容器,并且可以运行多个相同的MySQL容器,相互之间独立。

docker运行命令指定java启动堆参数命令_Docker_02

2、核心概念

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

docker客户端(Client):连接docker主机进行操作;

docker仓库(Registry):用来保存各种打包好的软件镜像;

docker镜像(Images):软件打包好的镜像;放在docker仓库中;

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



docker运行命令指定java启动堆参数命令_分布式_03

使用Docker的步骤:

1)、安装Docker

2)、去Docker仓库找到这个软件对应的镜像;(docker hub)

3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;

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

3、安装Docker

1)、安装linux虚拟机

1)、可以通过 VMWare 或VirtualBox;

2)、创建虚拟机(建议制作一个虚拟机,每次使用直接导入,免去安装)

5)、虚拟机网络设置为桥接模式(局域网其他主机可以访问该虚拟机)

service network restart

7)、查看linux的ip地址

ip addr

8)、使用客户端连接linux;

2)、在linux虚拟机上安装docker(下面安装和测试基于centos7)

步骤:(安装新版本docker跳过此步)

1、检查内核版本,必须是3.10及以上
uname -r
2、安装docker
yum install docker
3、输入y确认安装
4、启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker -v
Docker version 1.12.6, build 3e8e77d/1.12.6
5、开机启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
6、停止docker
systemctl stop docker

最新安装docker:(最新版本分为ce 个人,ee企业)

1.更新yum
sudo yum update 
2.卸载旧版本docker(如果没有,跳过)
sudo yum remove docker  docker-common docker-selinux docker-engine
3.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4.设置docker yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
6.安装docker
sudo yum install docker-ce  #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版
7.启动:
systemctl start docker
8.查看版本:
docker -v
9.设置开机启动
systemctl enable docker
10.停止docker:
systemctl stop docker

4、Docker常用命令&操作

1)、镜像操作

操作

命令

说明

检索

docker search 关键字 eg:docker search redis

我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。

拉取

docker pull 镜像名:tag

:tag是可选的,tag表示标签,多为软件的版本,默认是latest

列表

docker images

查看所有本地镜像

删除

docker rmi image-id

删除指定的本地镜像

https://hub.docker.com

2)、容器操作

软件镜像(类似软件安装包)----运行镜像----产生一个容器(正在运行的软件);

步骤:

1、搜索镜像
[root@localhost ~]# docker search tomcat
2、拉取镜像
[root@localhost ~]# docker pull tomcat
3、根据镜像启动容器
docker run --name mytomcat -d tomcat:latest
4、docker ps  
查看运行中的容器
5、 停止运行中的容器
docker stop  容器的id
6、查看所有的容器
docker ps -a
7、启动容器
docker start 容器id
8、删除一个容器
 docker rm 容器id
9、启动一个做了端口映射的tomcat
[root@localhost ~]# docker run -d -p 8888:8080 tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口    主机端口:容器内部的端口

10、为了演示简单关闭了linux的防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙
11、查看容器的日志
docker logs container-name/container-id

更多命令参看
https://docs.docker.com/engine/reference/commandline/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:

#进入容器
docker exec -it mysql bash

#登录mysql
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lzslov123!';

#添加远程登录用户
CREATE USER 'liaozesong'@'%' IDENTIFIED WITH mysql_native_password BY 'Lzslov123!';
GRANT ALL PRIVILEGES ON *.* TO 'liaozesong'@'%';
如何挂载目录:

为了安全性挂载目录可以将数据保存在本地,重启容器,配置等也不会失效。
首先执行下面的命令创建data目录和config目录
mkdir data
mkdir config
执行下面命令进入到config目录中,并在该目录中创建my.cnf配置文件

执行下面命令进入到config目录中,并在该目录中创建my.cnf配置文件

cd config
touch my.cnf

my.cnf配置文件内容如下

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

执行下面命令创建容器

docker run -d -p 3306:3306 
--restart always 
--privileged=true
--name mysql001
-e MYSQL_USER="testuser" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_ROOT_PASSWORD="123456"
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf 
-v /home/mysql/data:/var/lib/mysql 
-v /home/mysql/mysql-files:/var/lib/mysql-files
mysql:latest

参数说明

–restart always:开机启动
–privileged=true:提升容器内权限
-v=/home/mysql/conf/my.cnf:/etc/mysql/my.cnf :映射配置文件
-v=/home/mysql/data:/var/lib/mysql :映射数据目录

特别说明

如果没有添加--privileged=true参数,容器创建后不能正常启动,查看日志发现有权限的错误

容器内配置文件的目录:/etc/mysql/my.cnf可能随着版本或镜像文件变化,如果不确定可以先启动一个容器,进入后,查看后,再重新配置参数启动。

启动时,发现不指定-v /home/mysql/mysql-files:/var/lib/mysql-files也会报错。

简化常用的一个命令:

docker run -p 3306:3306 
--name mysql 
--privileged=true 
-e MYSQL_ROOT_PASSWORD=123456 
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf 
-v /home/mysql/logs:/logs 
-v /home/mysql/data:/var/lib/mysql 
-v /home/mysql/mysql-files:/var/lib/mysql-files 
-d mysql
mysql8.0加密方式的兼容:(如果在my.cnf中指定了,可以略过)
--5.7版本中可以看到加密采用的是:mysql_native_password*
--8.0中是caching_sha2_password*: 可通过下面命令查看
select user,host,plugin from user;
-- 修改密码并指定加密规则为mysql_native_password
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)

-- 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

后记

本文是我搭建docker过程中整理的笔记,也参考了部分网上资料,有误之处,留言轻喷!