1.简介
Docker是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。运行中的这个镜像称为容器,容器启动是非常快速的,容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
之前,我们在Linux上需要安装MySQL,Redis,Tomcat等软件,并做配置,有了Docker后,我们可以直接把这些软件的Docker镜像直接放到Linux上,这些镜像称为容器,它们是安装和配置好的,可以直接拿来使用,简化了Linux上的操作步骤。
2.核心概念
- Docker主机(Host):安装了Docker程序的机器,Docker可以直接安装在操作系统上
- Docker客户端(Client):连接Docker主机进行操作
- Docker仓库(Registry):保存各种打包好的镜像,Docker Hub:https://hub.docker.com/
- Docker镜像(Image):软件打包好的镜像,放在Docker仓库里
- Docker容器(Container):镜像启动后的实例称为一个容器,容器是独立运行的一个或一组应用
使用Docker的步骤:
- 安装Docker
- 去Docker仓库查找对应的镜像
- 使用Docker运行镜像,生成一个Docker容器
- 对容器的启动停止就是对软件的启动停止
3.安装Docker
1.安装Linux虚拟机
不会安装的可以看一下这篇博客,是一个最小化安装,当然安装完整版也可以,就是下载的时候需要的时间久一些,方法类似。
网络采用桥接的方式连接,开启虚拟机后,用ip addr命令查看ip地址,之后,用MobaXterm连接虚拟机,当然xshell等也可以。
2.在Linux虚拟机里安装Docker
Docker要求CentOS系统内核高于3.10,使用如下命令查看:
[root@localhost ~]# uname -r
3.10.0-1062.el7.x86_64
安装Docker,等待Linux从yum上下载需要的安装包和依赖,中途需要输入y表示确认安装:
[root@localhost ~]# yum install docker
查看Docker版本号:
[root@localhost ~]# docker -v
Docker version 1.13.1, build cccb291/1.13.1
启动Docker:
[root@localhost ~]# systemctl docker start
关闭Docker:
[root@localhost ~]# systemctl docker stop
将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.
4.Docker常用命令&操作
1.镜像操作
镜像检索:
docker search 关键词,比如docker search mysql
[root@localhost ~]# docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 9417 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 3392 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 688 [OK]
docker.io docker.io/centos/mysql-57-centos7 MySQL 5.7 SQL database server 74
docker.io docker.io/mysql/mysql-cluster Experimental MySQL Cluster Docker images. ... 66
docker.io docker.io/centurylink/mysql Image containing mysql. Optimized to be li... 61 [OK]
docker.io docker.io/deitch/mysql-backup REPLACED! Please use http://hub.docker.com... 41 [OK]
docker.io docker.io/bitnami/mysql Bitnami MySQL Docker Image 39 [OK]
docker.io docker.io/tutum/mysql Base docker image to run a MySQL database ... 34
docker.io docker.io/schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic back... 29 [OK]
docker.io docker.io/prom/mysqld-exporter 27 [OK]
docker.io docker.io/linuxserver/mysql A Mysql container, brought to you by Linux... 25
docker.io docker.io/centos/mysql-56-centos7 MySQL 5.6 SQL database server 19
docker.io docker.io/circleci/mysql MySQL is a widely used, open-source relati... 19
docker.io docker.io/databack/mysql-backup Back up mysql databases to... anywhere! 15
docker.io docker.io/mysql/mysql-router MySQL Router provides transparent routing ... 15
docker.io docker.io/arey/mysql-client Run a MySQL client from a docker container 13 [OK]
docker.io docker.io/fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron t... 6 [OK]
docker.io docker.io/openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 ima... 6
docker.io docker.io/genschsa/mysql-employees MySQL Employee Sample Database 5 [OK]
docker.io docker.io/devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offi... 3
docker.io docker.io/ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 2 [OK]
docker.io docker.io/jelastic/mysql An image of the MySQL database server main... 1
docker.io docker.io/monasca/mysql-init A minimal decoupled init container for mysql 0
docker.io docker.io/widdpim/mysql-client Dockerized MySQL Client (5.7) including Cu... 0 [OK]
name:镜像的名称,等下拉取镜像的时候会用到
description:镜像的描述
stars:类似于GitHub的stars,单位是K
OFFICIAL:OK代表官方
AUTO:OK代表自动配置
拉取镜像:
docker pull name[:tag],比如docker pull docker.io/mysql:8
[root@localhost ~]# docker pull docker.io/mysql
Using default tag: latest
Trying to pull repository docker.io/library/mysql ...
latest: Pulling from docker.io/library/mysql
拉取镜像时候,如果不带tag,默认下载latest版本,如果需要带tag,需要在name后跟上:tag即可,tag可以去这里查找:https://hub.docker.com/_/mysql?tab=tags
查看镜像列表:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql latest 0c27e8e5fcfa 3 days ago 546 MB
删除镜像:
[root@localhost ~]# docker rmi image-id,比如docker rmi 0c27e8e5fcfa
[root@localhost ~]# docker rmi 0c27e8e5fcfa
Untagged: docker.io/mysql:latest
2.容器操作
之前把MySQL的镜像给删掉了,这里使用Tomcat继续学习,首先下载Tomcat的镜像。
根据镜像启动容器:
docker run --name container-name -d image-name,其中--name表示自定义容器名,-d表示后台运行,image-name表示指定进行模板
[root@localhost ~]# docker run --name myTomcat -d tomcat[:tag]
de2f751e89eba475046c8e6502fb2d6b171682f010e827350f2f822cded02264
查看运行中的容器:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de2f751e89eb tomcat "catalina.sh run" 37 seconds ago Up 36 seconds 8080/tcp myTomcat
查看系统中所有容器:
[root@localhost ~]# docker ps -a
启动容器(当系统中有容器的时候):
[root@localhost ~]# docker start 容器id
停止容器:
[root@localhost ~]# docker stop 容器id
删除容器:
[root@localhost ~]# docker rm 容器id
要想使用容器,需要在启动容器的时候,指定镜像的端口映射:
[root@localhost ~]# docker run -d --name myTomcat -p 8080:8080 tomcat[:tag]
这里的-p是用来做端口映射,表示Linux服务器和容器内部端口的映射关系,先写Linux服务器端口,后写容器内部端口。
查看tomcat的启动日志:
docker logs 容器id
此时通过浏览器,访问Linux服务器ip+端口号,就可以看到Tomcat的启动界面了,这里我访问http://192.168.0.123:8080/即可。如果出现了404,检查下防火墙的策略,简单起见,直接关掉,检查下版本号,最新版本可能会出现404,因为新版的webapps下是空的,所以404了,新版本的欢迎页在webapps.dist里面,可以将文件复制到webapps里面,当然也可以换一个版本的镜像,我换了8.5.34就可以看到了。
更多命令详见官网:https://docs.docker.com/engine/reference/commandline/docker/。
如果需要启动多个tomcat,那么只需要修改-p参数的Linux服务器端口号即可。如下,可以在Linux的8081,8082,8083上再启动3台Tomcat,它们是互相独立的,互不干扰,实现横向扩展。
[root@localhost ~]# docker run -d --name myTomcat8081 -p 8081:8080 tomcat[:tag]
[root@localhost ~]# docker run -d --name myTomcat8082 -p 8082:8080 tomcat[:tag]
[root@localhost ~]# docker run -d --name myTomcat8083 -p 8083:8080 tomcat[:tag]
3.安装MySQL实例
使用命令docker pull mysql下载mysql的镜像。
错误的启动:
[root@localhost ~]# docker run -d mysql
使用docker ps -a命令会看到mysql的状态是Exited的,所以说启动失败了。
查看mysql启动日志:
[root@localhost ~]# docker logs 3e7d26567ff1
2020-04-27 01:21:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-04-27 01:21:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-04-27 01:21:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-04-27 01:21:28+00:00 [ERROR] [Entrypoint]: 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 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
77e1684a15333a36e805d1bceb6c9a44d12a2b8696041220be97cf78ab899e2c
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77e1684a1533 mysql "docker-entrypoint..." 4 seconds ago Up 4 seconds 3306/tcp, 33060/tcp eloquent_clarke
上面的命令,我没有带--name,那么会随机生成一个name,需要注意的点是带上-p参数,-e参数。不带-e会启动失败,不带-p,启动了没法访问。
Docker Hub上关于MySQL的配置:https://hub.docker.com/_/mysql。
如果你的MySQL自定义配置文件是/my/custom/config-file.cnf,可以使用以下方式启动容器,这个容器会结合默认配置文件和你指定的配置文件,进行启动。
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
如果不想指定配置文件,也可以在启动容器的时候,把需要的参数挂在后面。
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci