Docker
Docker是什么?
虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
容器技术和宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,并且与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。
容器的优势
1.启动速度快,秒级别
2.空间占用小
3.Docker 更轻量。、Docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
4.与虚拟机相比,Docker 隔离性更弱。Docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。
5.与虚拟机相比,Docker 安全性更弱。容器容易受到攻击,并且docker中的root权限等同宿主机的root权限。
6.具有高可用和可恢复性
镜像,容器,仓库
Image(镜像)
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角
Container(容器)
容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。
Repository(仓库)
Docker 仓库是集中存放镜像文件的场所。 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。
有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈,并不严格区分。一个 Docker Registry 中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应着一个镜像。
所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 Latest 作为默认标签。
安装的前提条件
体系架构:Docker支持X86-64 ,其他体系架构的支持则一直在不断地完善和推进中。
Docker 分为CE和EE两大版本。CE即社区版,免费支持周期7个月。EE即企业版,强调安全,付费使用,支持周期 24 个月。
centos-extras库必须启用。该存储库默认情况下为启动的,但是如果您已禁用它,则需要重新启动。
AdditionalResources/Repositories - CentOS Wiki
建议使用overlay2存储驱动程序。
环境准备
Docker Engine软件包现在称为docker-ce
卸载旧版本:
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
复制
安装方法
在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker。
设置存储库
安装yum-utils软件包(提供yum-config-manager实用程序)并设置稳定的存储库。
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
复制
安装最新版docker
sudo yum install docker-ce docker-ce-cli containerd.io
安装指定版本的docker
1.列出并排序存储库中可用的版本。版本号(从高到低)对结果进行排序:
yum list docker-ce —showduplicates | sort -r
2.安装指定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
例如:
sudo yum install docker-ce-20.10.2-3.el7 docker-ce-cli-20.10.2-3.el7 containerd.io ... ... Installed: containerd.io.x86_64 0:1.4.4-3.1.el7 docker-ce.x86_64 3:20.10.2-3.el7 docker-ce-cli.x86_64 1:20.10.2-3.el7 Dependency Installed: container-selinux.noarch 2:2.119.2-1.911c772.el7_8 docker-ce-rootless-extras.x86_64 0:20.10.5-3.el7 fuse-overlayfs.x86_64 0:0.7.2-6.el7_8 fuse3-libs.x86_64 0:3.6.1-4.el7 slirp4netns.x86_64 0:0.4.3-4.el7_8 Dependency Updated: libselinux.x86_64 0:2.5-15.el7 libselinux-python.x86_64 0:2.5-15.el7 libselinux-utils.x86_64 0:2.5-15.el7 libsemanage.x86_64 0:2.5-14.el7 libsemanage-python.x86_64 0:2.5-14.el7 libsepol.x86_64 0:2.5-10.el7 policycoreutils.x86_64 0:2.5-34.el7 policycoreutils-python.x86_64 0:2.5-34.el7 selinux-policy.noarch 0:3.13.1-268.el7_9.2 selinux-policy-targeted.noarch 0:3.13.1-268.el7_9.2 setools-libs.x86_64 0:3.3.8-4.el7 Complete!
复制
Docker已安装但尚未启动。docker创建该组,但没有用户添加到该组。
如果想删除docker,使用命令:
sudo yum remove docker-ce
sudo rm -rf /var/lib/docker
启动docker
启动dockersudo systemctl start docker
检测docker是否安装成功
ps -ef|grep docker
sudo docker run hello-world
docker version
root@localhost ~]# sudo systemctl start docker [root@localhost ~]# ps -ef|grep docker root 14706 1 0 20:58 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 14917 10930 0 20:59 pts/1 00:00:00 grep --color=auto docker [root@localhost ~]# sudo docker run hello-world ··· Status: Downloaded newer image for hello-world:latest Hello from Docker! ··· [root@localhost ~]# docker version Client: Docker Engine - Community Version: 20.10.2 API version: 1.41 Go version: go1.13.15 Git commit: 2291f61 Built: Mon Dec 28 16:17:48 2020 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.2 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 8891c58 Built: Mon Dec 28 16:16:13 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.4 GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e runc: Version: 1.0.0-rc93 GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec docker-init: Version: 0.19.0 GitCommit: de40ad0
复制
安装mysql
docker pull mysql-server docker pull mysql/mysql-server:8.0.23 docker images docker container ls docker ps docker images docker run -p 3306:3306 --name mysql8023 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:latest docker container ls
复制
其中,刚才安装的是指定版本,比如8.0.23,那么我们就需要执行以下命令:
[root@localhost ~]# docker run -p 3306:3306 --name mysql8023 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:8.0.23 da4fa913f8396d56cc678af4cd1689a3167cbbe2054387f9d4e47e3418770e9d
复制
检查是否安装成功:
[root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES da4fa913f839 mysql/mysql-server:8.0.23 "/entrypoint.sh mysq…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:3306->3306/tcp, 33060-33061/tcp mysql8023 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES da4fa913f839 mysql/mysql-server:8.0.23 "/entrypoint.sh mysq…" 31 minutes ago Up 31 minutes (healthy) 0.0.0.0:3306->3306/tcp, 33060-33061/tcp mysql8023
复制
进入docker,登陆MySQL
使用命令docker exec -it da4fa913f839 bash
进入容器
[root@localhost ~]#docker exec -it da4fa913f839 bash bash-4.2#mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 64 Server version: 8.0.23 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. 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目录映射到宿主机步骤参考文章MySQL Docker 环境下运行
查询MySQL Logs
[root@localhost ~]#docker logs mysql8023 ··· [Entrypoint] Starting MySQL 8.0.23-1.1.19 2021-03-31T13:42:48.891443Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 122 2021-03-31T13:42:48.908665Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2021-03-31T13:42:49.462465Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2021-03-31T13:42:49.820720Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock 2021-03-31T13:42:50.062145Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2021-03-31T13:42:50.062416Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 2021-03-31T13:42:50.126964Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server - GPL.
复制
以非root用户管理docker
Docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由用户拥有root,其他用户只能使用来访问它sudo。Docker守护程序始终以root用户身份运行。
如果不想在docker命令前添加sudo,可以创建一个Unix组docker,并将其添加用户。Docker守护程序启动时,它会创建一个可由docker组成员访问的Unix套接字。
要创建docker组并添加您的用户,请执行以下操作:
sudo groupadd docker sudo usermod -aG docker $USER ##注销并重新登录,重新评估组成员身份。 ##如果在虚拟机上进行测试,则可能需要重新启动虚拟机以使更改生效。 ##在台式机Linux环境(例如X Windows)上,完全注销会话,然后重新登录。 ##在Linux上,可以运行以下命令来激活对组的更改: newgrp docker #验证是否可以运行docker不带命令的命令sudo docker run hello-world
复制
配置docker自启动
sudo systemctl enable docker.service sudo systemctl enable containerd.service
复制
禁用时候使用:
sudo systemctl disable docker.service
sudo systemctl disable containerd.service
参考
安装说明:Install Docker Engine on CentOS | Docker Documentation
操作指南:https://docs.docker.com/get-started/
指定版本的MySQL镜像:Docker Hub
MySQL快速参考:Docker Hub
MySQL Docker 环境下运行
一篇堪称Docker经典教科书的文章 - 知乎
史上最全(全平台)docker安装方法! - 知乎