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 等等。
windows镜像方便了我们给多个电脑配置环境。类似的,docker通过镜像让我们很方便在不同主机上,通过简单的命令就可以搭建常用的开发环境,比如tomact,mysql 等等,并且各个应用容器启停方便迅速,而且安装时有版本控制,保证了各个机器的环境一致,极大简化开发中环境带来的问题,让开发者把精力放在重要的业务上。
Mysql连同相关的配置,就可以打包成一个MySQL-Docker镜像,然后在有docker环境的机器上运行产生一个MySQL容器,并且可以运行多个相同的MySQL容器,相互之间独立。
2、核心概念
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
使用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 | 删除指定的本地镜像 |
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过程中整理的笔记,也参考了部分网上资料,有误之处,留言轻喷!