2022版Docker基础篇 - 8、Docker常规安装简介
Docker常规安装简介
总体步骤
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
服务端口映射 - 停止容器
- 移除容器
安装tomcat
1、docker hub上面查找tomcat镜像
docker search tomcat
2、从docker hub上拉取tomcat镜像到本地
docker pull tomcat
3、docker images查看是否有拉取到该tomcat
docker images tomcat
4、使用tomcat镜像创建容器实例(也叫运行镜像)
docker run -it -p 8080:8080 tomcat
-p
小写,主机端口:docker容器端口
-P
大写,随机分配端口
i
:交互
t
:终端
d
:后台
docker run -d -p 8080:8080 --name t1 tomcat
5、 访问tomcat首页
localhost:8080
遇到的问题:
可能一:
没有映射端口或者没有关闭防火墙
可能二:
把webapps.dist目录换成webapps:先将webapps这个空文件夹删除,再将webapp.dist重命名为webapps
docker exec -it 1fc238d4cf10 /bin/bash
【进入tomcat容器中】
重命名之后,再次访问localhost:8080
6、免修改版说明
使用tomcat8这个特定版本:
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
安装mysql
1、docker hub上面查找mysql镜像
docker search mysql
2、从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
docker pull mysql:5.7
3、使用mysql5.7镜像创建容器(也叫运行镜像)
命令出处:https://hub.docker.com/_/mysql
简单版
使用mysql镜像
第一步:运行mysql:5.7镜像
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
注意:建议先使用ps -f | grep mysql
命令先看一下宿主机是否有正在运行的mysql且端口3306是否被占用,如果占用,需要将映射端口换掉。
ps -f | grep mysql
第二步:查看正在运行的容器
docker ps
第三步:进入该mysql容器内
docker exec -it 容器ID /bin/bash
mysql -uroot -p
docker exec -it afd4ff88c01c /bin/bash
第四步:在该容器内建库建表插入数据
外部Win10使用小海豚软件连接运行在dokcer上的mysql容器实例服务,如下图所示:
客户端软件可以成功连接mysql容器。
问题
问题一:插入中文数据试试
为什么报错?
因为使用docker的mysql容器有中文乱码的问题。
在docker里面的mysql容器实例输输入以下命令,内容如下
SHOW VARIABLES LIKE 'character%';
注意:不要在连接mysql的软件中输入上面的命令,否则显示的还是utf-8编码,但这不是真正的编码方式。
解决:详见下面的实战版。
问题二:删除容器后,里面的mysql数据如何办
容器实例一删除,你还有什么? 删容器到跑路。。。。。?
实战版
1、新建mysql容器实例
docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/log:/var/log/mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/log:/var/log/mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
注:实战版运行mysql镜像的命令与简单版运行的命令差不多,只是多了三个挂载数据卷的命令。
2、新建my.cnf --> 通过容器卷同步给mysql容器实例 (使用此步骤的目的是解决中文乱码的问题)
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
cd /docker/mysql/conf
vim my.cnf
SHOW VARIABLES LIKE 'character%';
3、重新启动mysql容器实例再重新进入并查看字符编码
docker restart mysql
再新建库新建表再插入中文测试
以上成功解决中文乱码的问题。
结论
之前的DB 无效
修改字符集操作 + 重启mysql容器实例
之后的DB 有效,需要新建
结论:docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据
假如将当前容器实例删除,再重新来一次,之前建的db1实例还有吗?
docker rm -f mysql
docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/log:/var/log/mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
【再次启动mysql容器】
答案是还有,所以日常工作中建议挂载数据容器卷,这样即使删除了容器实例,当重新启动了该容器后,宿主机上对应的容器卷中的数据还会自动传递给该容器,保证了数据的不丢失。
安装redis
从docker hub上(阿里云加速器)拉取redis镜像到本地标签为6.0.8
docker pull redis:6.0.8
入门命令
docker run -d -p 6379:6379 redis:6.0.8
命令提醒:容器卷记得加入--privileged=true
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied解决办法:在挂载目录后多加一个--privileged=true
参数即可
在CentOS宿主机下新建目录 /app/redis
1、建目录
mkdir -p /app/redis
2、将一个redis.conf文件模板拷贝进 /app/redis 目录下
cp /myredis/redis.conf /app/redis/
3、/app/redis目录下修改redis.conf文件
vim redis.conf
3.1、开启redis验证 可选 requirepass 123
3.2、允许redis外地连接 必须 注释掉 # bind 127.0.0.1
3.3、daemonize no
将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run 中 -d参数冲突,会导致容器一直启动失败
3.4、开启redis数据持久化 appendonly yes 可选 - 默认出厂的原始redis.conf
4、使用redis6.0.8镜像创建容器(也叫运行镜像)
docker run -p 6379:6379 --name myredis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
docker run -p 6379:6379 --name myredis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
测试redis-cli连接上来
docker exec -it 运行着Redis服务的容器ID redis-cli
请证明docker启动使用了我们自己指定的配置文件
修改前 我们用的配置文件,数据库默认是16个
修改后
vim /app/redis/redis.conf
docker restart myredis
docker exec -it myredis /bin/bash
redis-cli
宿主机的修改会同步给docker容器里面的配置。 - 记得重启服务
安装Nginx
见高级篇Portainer