一、Docker理解与安装
1.1 Docker概述与其原理
目前,docker的研发者们维护了相关的三个网站:
🕸三个网站分别介绍docker的构成、安装、使用、文档和仓库
Docker官网:https://www.docker.com/
Docker文档:https://docs.docker.com/
Docker仓库:https://hub.docker.com/
Docker总的有以下几个部分:
Docker_Client
是Docker安装在本地的客户端,可以通过docker build、docker pull、docker run
等指令构建/拉取/运行程序。
Docker_Host
是Docker安装在本地的主机,它通过拉取Registry
仓库中的程序文件,在本地构成镜像。
Registry
是仓库,仓库(Repository)是集中存放镜像文件的场所。
仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载;国内的公开仓库包括阿里云 、网易云等。
可以在这些仓库上注册自己的账号、上传程序,之后将这些程序拉取到docker中运行
。
Docker 镜像(Image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器; 就好似 Java 中的类和对象,类就是镜像,容器就是对象。
Docker 利用容器(Container)独立运行的一个或一组应用,容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除;每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
🌍总结:
Docker 本身是一个
容器运行载体
或称之为管理引擎
,我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件;只有通过这个镜像文件才能生成 Docker 容器
;image 文件可以看作是容器的模板;Docker 根据 image 文件生成容器的实例;同一个 image 文件,可以生成多个同时运行的容器实例。image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过
docker客户端
创建一个对应的运行实例,也就是我们的容器。至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。
1.2 Docker的安装
1.2.1 安装前环境检查
首先判断测试机器上是否已经安装Docker
,如果要重新安装,要保证删除干净才能安装。
如果有旧版本,需要:
卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
再检查linux版本信息(centos环境):
-
安装docker,linux版本要在7以上,系统内核版本要在3.10以上。
-
centos7.0和centos8.0docker的操作,支持的库是不同的。
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$ uname -r
3.10.0-957.27.2.el7.x86_64
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$
linux版本信息
1.2.2 安装相关软件包及依赖
yum安装gcc相关环境(需要确保 虚拟机可以上外网 )
yum -y install gcc
yum -y install gcc-c++
gcc相关环境安装完成后,可以通过gcc -v查看
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
安装需要的软件包
yum install -y yum-utils
以上就安装完了docker所需要的相关软件包
接下来使用yum
安装docker,因为yum
刚开始默认使用国外的镜像仓库,这里推荐改成国内的。
🌏添加阿里云的环境:
yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo
🌍更新yum软件包索引:
yum makecache fast
然后使用yum安装docker
yum -y install docker
使用docker -v
查看docker版本和安装结果。
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$ docker -v
Docker version 1.13.1, build 7d71120/1.13.1
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$
至此,docker的安装完成,总的来说就是在已满足的环境下使用yum install -y docker
去安装。
可以使用docker -h
去查看docker相关的命令。
🍊 为了更加方便的使用docker,需要将其加入开机启动中。
启动前应当设置源
vim /usr/lib/systemd/system/docker.service
使用:
systemctl enable docker
systemctl start docker启动docker服务。
注意:测试机器上可能有其他人的docker服务,停止之前最好先查看
1.2.3docker初始化及登录使用
docker的仓库中有很多的源,可以拉取其中的镜像到本地。
例如需要在本地运行centos7:docker pull centos:centos7
拉取了这个镜像之后需要初始化/启动容器。
docker run --net bridge --privileged -itd --cpus=4 centos:centos7 /usr/sbin/init
参数很重要:/usr/sbin/init是docker启动的自己的目录,不能更改。
但是docker运行输出的相关数据可以和物理机形成一个映射。通过-v
参数设置
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$ sudo docker run -v /flash/xxx/data/test-mysql/:/data/ --net bridge --privileged -itd --cpus=4 centos:centos7 /usr/sbin/init
xxx0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-v 物理机路径:docker路径
,这样docker中的路径下的数据目录就会同步到物理机的路径中。
之后输出的一串字符xxx0xxxxxxxxxxxxxxxxx就是docker的镜像的标号。就像物理机上evm-c8e31fv9upsvqdh319c0
这一串一样。
通过这个字符串去登录特定的docker中的运行的镜像。
登录:
docker exec -it [id] /bin/bas
id就是这个字符串,不用输全,docker会自动匹配到。
[@evm-c8e31fv9upsvqdh319c0 test-mysql]$ sudo docker exec -it bf3 /bin/bash
[root@xxxcde42f91f /]# ls
anaconda-post.log data etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@xxxcde42f91f /]#
其中,xxx[id]
就代表root@xxxcde42f91f
的编号。
之后就登录上了docker中的centos7的环境。
退出docker使用centos7命令用exit
,不要简单的ctrl + z
遇到container不正常时,可以重启它,注意不要随便重启docker服务,
docker contianer restart
二、运行MySQL程序
2.1 编译mysql环境准备
安装相关依赖:
sudo yum install -y epel-release
sudo yum install -y wget bzip2 automake autoconf libtool make bison libaio \
libaio-devel git openssl openssl-devel curl-devel lrzsz libffi-devel \
ncurses-devel zip unzip perl-JSON perl-Digest-MD5 \
&& $SUDO yum clean all
这些依赖是5.7版本用的比较多,如果不装这些依赖,会在编译过程中提示各种问题。
cmake安装,对于5.7来说,yum默认的低版本就可以满足要求,但是8.0版本的mysql的编译需要cmake3.0以上才能支持。
相对于传统的去官网下载安装包后解压编译安装,更加推荐wget国内源
,解决网络连接问题后,再解压编译安装。
较为快一点版本:
wget https://cmake.org/files/v3.23/cmake-3.23.0-rc2.tar.gz
当然也可以去github官方下载:
wget https://github.com/Kitware/CMake/releases/download/v3.23.3/cmake-3.23.3.tar.gz
因为docker中的环境和物理机器上的目录构成了映射,所以可以直接在物理机上下载。之后在docker中的centos7上就有相关的文件。
以cmake-3.23.0-rc2
版本为例
#解压
tar -zxvf cmake-3.23.0-rc2.tar.gz
cd cmake-3.23.0-rc2
./bootstrap --prefix=/usr/local
#编译安装
make && make install
#配置path
vi ~/.bash_profile
PATH=/usr/local/bin:$PATH:$HOME/bin
安装高版本的cmake时,./boostrap --prefix=/usr/lcoal
需要高版本的GCC支持,所以需要先安装高板的的gcc。
yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm
yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-2-3.el7.centos.noarch.rpm
yum install devtoolset-11-gcc-c++
source /opt/rh/devtoolset-11/enable
安装完成之后查看gcc 版本
[root@aa0cde42f91f data]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-11/root/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-11/root/usr --mandir=/opt/rh/devtoolset-11/root/usr/share/man --infodir=/opt/rh/devtoolset-11/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --with-default-libstdcxx-abi=gcc4-compatible --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-11.2.1-20220127/obj-x86_64-redhat-linux/isl-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.2.1 20220127 (Red Hat 11.2.1-9) (GCC)
[root@aa0cde42f91f data]#
然后再编译cmake。
编译安装cmake完毕,再配置path
之后就可以使用了。
[root@aa0cde42f91f cmake-3.23.0-rc2]# cmake -version
cmake version 3.23.0-rc2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
[root@aa0cde42f91f cmake-3.23.0-rc2]#
🍎到此,安装mysql需要的工具包,cmake、gcc都准备好了。
工具包是最开始安装的,主要是解决5.7版本各种库缺失的问题。
cmake工具是mysql高版本要求,必须要cmake3.0以上。
gcc也是mysql高版本的要求,不同的小版本不一样,但是gcc11.0以上完全可以满足要求。
2.2 注意弱密码问题
首先,mtr测试的时候是可能产生弱密码的,例如有些用户权限,如果并没有创建用户直接赋权,那么mysql将自动为这个用户创建一个空的密码。
其次,mysql编译安装的时候是不能有弱密码的,不能用 --insecuret的方式去初始化,必须有秘密,之后也必须改密码。
2.3 编译安装mysql
在自己的物理机器上传需要编译安装的版本,之后在容器中看到一样的数据,然后进行编译安装。
以5.7版本为例,在物理机器上传需要安装的源代码。下载源码解压后,cmake命令
cmake . -DCMAKE_INSTALL_PREFIX=../mysqlexec -DMYSQL_DATADIR=../mysqldata -DWITH_BOOST=./boost -DSYSCONFDIR=./etc -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_EMBEDDED_SERVER=1 -DWITH_DEBUG=1
之后编译安装:
make -j 5&& make install
如果没有配置文件就创建配置文件:
配置文件my.cnf
内容:
[mysqld]
user = root
port=9888
socket=/data/mysqldata/mysql_9888.sock
datadir=/data/mysqldata
log_error=/data/mysqldata/logs/error.log
basedir=/data/mysqlexec/
server-id=131 #here use ip tail
初始化mysql(必须有密码):
./mysqld --initialize --user=root --basedir=/flash/xxx/data/teledb8.0/mysqlexec/ --datadir=/flash/xxx/data/teledb8.0/mysqldata/
按配置文件启动:
./mysqld_safe --defaults-file=/data/mysqlexec/etc/my.cnf &
启动后修改密码:
ALTER USER USER() IDENTIFIED BY '新密码'
修改密码后重新登录就可以了:
[root@aa0cde42f91f bin]# ./mysql --socket=/data/mysqldata/mysql.sock -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.7.46-log MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
至此,在docker中安装运行mysql完毕。