Docker
一、何为Docker
Docker是一个开源的应用容器引擎,基于GO语言并遵循从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后在发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用这可以之间使用这个镜像。运行中的这个镜像称为容器,容器启动是非常快速的。
二、Docker核心概念
docker镜像(Images):Docker镜像适用于创建Docker容器的模板。
docker容器(Container):容器时独立运行的一个或一组应用。
docker客户端(Client):客户端通过命令行或者其他工具使用Docker。
docker主机(Host):一个物理或者虚拟的机器用于执行Docker守护进程和容器。
docker仓库(Registry):Docker仓库用来保存镜像,可以理解为代码控制中心的代码仓库。DockerHub(https://hub.docker.com)提供了庞大的镜像集合供使用。
使用Dockers的步骤:
1)、安装Docker;
2)、去Docker仓库找到这个软件的镜像;
3)、使用Docker运行这个镜像,这个镜像就会生成一个容器;
4)、对容器的启动停止就是对软件的启动停止;
三、安装Docker
查看Contos版本
uname -r
$$
Docker要求Contos系统的内核版本高于3.1.0
$$
升级软件包及内核;(选做)
yum update
安装Docker
yum install docker
启动Docker
systemctl start docker --启动Docker备注: 此处启动可能会报错,解决方法参考文末常见问题
将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.
四、常用操作
***Docker的仓库 (Docker Hub)
1、镜像操作
操作 | 命令 | 说明 |
检索 | docker search 关键字 eg:docker search redis | 我们经常去docker hub 上检索镜像的详细信息,如镜像的TAG。 |
拉取 | docker pull 镜像名:tag | :tag 是可选的,tag表示标签,多为软件的版本,默认是latest(最新的)。 |
列表 | docker images | 查看所有本机镜像 |
删除 | docker rmi image-id | 删除指定的本地镜像 |
检索信息详情
INDEX | NAME | DESCRIPTION | STARS | OFFICIAL | AUTOMA |
索引 | 镜像的名称,一般只需要看/后面的内容 | 说明 | 关注人数k | 是否是官方 | 是否自动配置 |
2、容器操作
操作 | 命令 | 说明 |
运行 | docker run -name container -name -d image-name eg:docker run name myredis -d redis | -naem:自定义容器名 -d:后台运行 image-name:指定镜像模板 |
列表 | docker ps (查看运行中 的容器) | 加上-a;可查看所有容器 |
启动 | docker start container-name/container-id | 启动容器 |
停止 | docker stop container-name/container-id | 停止当前你所运行的容器 |
删除 | docker rm container-id | 删除指定的容器 |
端口映射 | -p 3306:3306 eg:docker run -d -p 3306:3306 --name myreids docker.io/redis | -p:主机端口(映射到)容器内部的端口 |
容器日志 | docker logs container-name/container-id | |
更多命令 | https://docs.docker.com/engine/reference/commandline/docker/ | 集体操作以官网仓库操作步骤为主 |
docker ps 或者 docker ps -a 显示的内容:
CONTAINER ID #容器ID
IMAGE #镜像名称
COMMAND #执行的cmd
CREATED #创建了多久
STATUS #容器的status:Up(正在运行) or Exited(不在运行)
PORTS #端口映射情况,默认tcp
NAMES #容器别名
2、安装Tomcat
1、docker search tomcat; ----在Docker仓库检索Tomcat
2、docker pull tomcat; -----从Docekr公共仓库拉取Tomcat(默认版本:latest,最新版)3、docker images; ----查看本地镜像仓库
4、docker run -d --name MyTomcat_8888 -p 8888:8080 image-name/image-id ----配置端口映射,启动Tomcat容器(使用浏览器访问:ip+端口号访问,如遇'404',参考文末可能遇到的问题第三条)
3、安装MySQL(不要在正式环境中使用docker安装mysql)
1、docker search mysql; ----在Docker仓库检索mysql
2、docker pull mysql; -----从Docekr公共仓库拉取mysql(默认版本:latest,最新版)3、docker images; ----查看本地镜像仓库
4、docker run -d --name mysql-3308 -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 image-name/image-id ----启动mysql容器(连接数据库,我使用的是IDEA自带的:++正常情况是用不了的++,参考文末可能遇到的问题第三条)
需要使用到的命令:
查看安装的镜像: docker images
查看启动的容器: docker ps
查看所有容器: docker ps -a
查看容器日志: docker logs
容器id启动mysql(参考Docker仓库中MySQL参考文档): docker run --name mysql01 -e MYSQL_ROOT_PASSWORD= 123456 -d mysql
启动mysql并进行端口映射(可以外部访问): docker run -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
可能遇到的问题:
1、启动Docker时报错
1、报错信息:
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
问题原因:
因为使用命令: yum install docker下载时, 默认下载的是Docker的最新版本, 但是内核版本低的话可能不兼容新版本Docker, 所以有可能出现如上错误。
解决方法:
卸载Docker,更新Linux系统内核。
具体操作:
1、卸载Docker
命令:yum remove docker-*
2、更新Linux系统内核
命令:yum update
3、重启
命令:reboot**
2、报错信息:
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
问题原因:
CentOs Linux 8 从 2021.12.31 号后已经停止维护,所以之后更新镜像需要通过 vault.centos.org来获取更新。
所以需要修改软件源mirrors 地址,具体操作如下:
修复具体操作:
# 进入yum.repos.d 目录下
cd /etc/yum.repos.d/
# 修改源链接
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
# 要将之前的mirror.centos.org 改成 vault.centos.org
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
2、Tomcat做了端口映射之后,访问时报'404'
网页反馈报错信息:
HTTP Status 404 – 未找到
Type Status Report
消息 Not found
描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
Apache Tomcat/9.0.34
问题原因:
Docker启动的Tomcat容器中的webapps文件夹下的#ROOT#,文件夹缺失导致的。
(如果需要多个容器,每个都需要设置)
解决方法:
找到你本地的Tomcat中的webapps下的ROOT文件夹,
再通过Xftp发送的Linux的某个路径下,
然后通过命令将ROOT文件拷贝只需要的容器中。
具体操作:
1、找到你本地的Tomcat中的webapps下的ROOT文件夹;
2、再通过Xftp发送的Linux的某个路径下;
3、然后通过命令将ROOT文件拷贝只需要的容器中
[root@localhost /]# docker cp /usr/local/myTomcat/apache-tomcat-9.0.35/webapps/ROOT 151176e3682e:/usr/local/tomcat/webapps/
3、MySQL启动之后,不能调用,用命令调用也提示找不到MySQL
网页反馈报错信息:
[08001] Could not create connection to database server. Attempted
reconnect 3 times. Giving up.
java.net.ConnectException: Connection refused: connect.
问题分析:
```shell
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES (说明)
a55f4a089865 mysql "docker-entrypoint..." 6 seconds ago Up 4 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp mysql-3308 (MySQL是启动成功的,但是还不能使用)
8f422d552e8d mysql "docker-entrypoint..." 17 hours ago Up 27 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-3306 (MySQL启动成功,并配置成功,可以使用的)
151176e3682e 927899a31456 "catalina.sh run" 20 hours ago Up 14 minutes 0.0.0.0:8888->8080/tcp MyTomcat_test
```
需要将root用户添加到设置中
解决方法:
需要将root用户添加到设置中
(如果需要多个容器,只需要设置一次)
具体操作:
#启动
docker run --name mysql-3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456! -d mysql
#进入容器
docker exec -it mysql bash
#登录mysql
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#添加(新的)远程登录用户 (这一步可以省略)
CREATE USER 'bog'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'bog'@'%';
#退出(需要退出两次,第一次退出应用,第二次退出容器)
exit(或者快捷键:Ctrl+D)
# 重新使用数据库客户端工具就可以连接到了。
方法仅供参考,具体解决方法根据情况而定情况
相关链接:
菜鸟教程|Docker教程: https://www.runoob.com/docker/docker-tutorial.html
Docker 官网:https://www.docker.com
Docker仓库 官网:https://hub.docker.com
Github Docker 源码:https://github.com/docker/docker-ce