手动制作Docker镜像
1. 下载运行操作系统的容器
docker pull centos:7 # 可以查看 Docker Hub 官方以取得名称
docker run -it --name centos7 centos:7
2. 换源并安装对应软件
此处换为阿里云的源(同时更换 yum 和 epel)
此处安装 mysql 和 httpd
安装mysql
见下面的额外内容
安装httpd
yum install httpd
安装网络工具(netstat 等)
yum install net-tools
使用命令 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 修改时区为东八区
3. 将容器保存为镜像
docker commit
最后运行该镜像(启动对应服务的命令,并阻塞),如:
docker run -d -p 81:80 nginx -g 'daemon off;'
apache 为 httpd -D FOREGROUND
如果一次需要执行多个命令,可以写成一个脚本并执行脚本。
额外内容 - 在 Docker的 CentOS 中安装 mysql
本来以为是个很简单的过程居然折腾了这么久,之前部署云服务器时也没有好好地记录,因此记录下。
简要注意点:首次登陆修改密码、允许从任意 ip 以 root 身份登陆、开启关闭服务
之后使用:rpm -ivh mysql57-community-release-el7-9.noarch.rpm 安装源
使用 yum install mysql-server 安装,并启动 mysqld --user root (由于云服务器默认使用root)。此时可能立刻停止后退出,并报 Can't open and lock privilege tables: Table 'mysql.user' doesn't exist 错误,查看配置文件 /etc/my.conf,发现 datadir=/var/lib/mysql,因此使用 mysqld --initialize --user=mysql --datadir=/var/lib/mysql。如果提示目录中已经有数据,则删除目录后重建即可。
使用 cat /var/log/mysqld.log | grep password 查看临时密码,登陆后修改密码。如果提示密码不合要求,用 set global validate_password_policy=LOW; 降低密码要求
设置允许 root 从任意 ip 登陆
use mysql;
select user, host from user;
update user set host = '%' where user = root; # 原值为localhost
flush privileges;
亦可使用:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;
flush privileges;
其中 “ *.* ” 代表所有资源所有权限, “ 'root'@% ” 其中 root 代表账户名,% 代表所有的访问地址,也可以使用一个唯一的地址进行替换,只有一个地址能够访问。如果是某个网段的可以使用地址与%结合的方式,如 10.0.42.%。IDENTIFIED BY 'root',这个 root 是指访问密码。WITH GRANT OPTION 允许级联授权。
切记无论什么时候一定要搞清命令的含义再执行!!!
鄙人就是因为没有搞清楚此条命令的含义,照抄照搬。别人的 写 “root” 我也跟着写 “root”,自然搞得一团糟而且登陆不上去。
这和萌萌新(本人萌新23333)照抄群里的 rm -rf / 有什么区别 ???
启动 mysql 服务。有两种方式,但必须组合使用,不能混用:
使用 systemctl (针对CentOS 7.0及以上版本,7.0 以下版本使用 service 命令)
systemctl start mysqld
systemctl stop mysqld
使用 mysql 程序自带的命令
# 由于云服务器默认root登陆,需要加上 --user root
# & 号表示后台运行,否则会阻塞
mysqld start --user root &
mysqladmin -u root -p shutdown
终于完成!
额外内容 - 原先的启动 CentOS7 的 Docker 镜像方式(坑)
我原先的启动命令为:
docker run -it --privileged --name centos7 centos:7 /usr/sbin/init
因为启动时如果不加 ** --privileged ** 和 ** /usr/sbin/init **,则无法使用 systemctl 命令来启动和停止服务。而使用此方式后,会调用 /usr/sbin/init 来加载镜像,当前窗口会直接无法操作,如下:
而保存该容器为镜像后,如果启动时不加这两个参数,则会报错:
然而比较奇怪的是,以此种方式启动的容器,安装 mysql 时不需要执行其它操作,yum install mysql 安装后就可以正常使用。猜测是 mysql 安装时需要调用系统的命令执行一些服务,而不加 --privileged 和 /usr/sbin/init 无法正常使用系统服务。
因此正确的方式应为:安装软件后,使用软件本身的程序启动而不是使用 systemctl 启动(如文章开头所述)
参考:
mysql的安装
标签:安装,手动,使用,user,https,mysql,镜像,Docker,root
来源: https://www.cnblogs.com/battor/p/build_docker_image_by_manual.html