前言
docker是个好东西,小树莓派上也能快速部署,方便管理环境。用这篇笔记来记录下各种软件的快速部署方式
准备环境
docker安装
curl -fsSL https://get.docker.com -o get-docker.sh
sh ./get-docker.sh
docker镜像源配置
一种方法是设置proxy,可以修改/etc/systemd/system/docker.service.d/http-proxy.conf
文件,设置对应的ip和port:
[Service]
Environment="HTTP_PROXY=http://xxx:xxx/"
Environment="HTTPS_PROXY=http://xxx:xxx/"
另一种方法是修改/etc/docker/daemon.json
,设置镜像源(可以参考这篇博客配置下),方便之后docker pull
。
{ "registry-mirrors": ["https://xxxxxxxxx"] }
最后重启一下docker服务systemctl daemon-reload && systemctl restart docker
常用docker服务
基本思路是安装镜像-启动容器。以下均假设root用户。
nginx网站服务器
# 下载镜像 也可以换成nginx:latest
docker pull nginx:1.27.4# 首先随便启动一个nginx容器
docker run --name nginx -d nginx:1.27.4# 把默认的配置文件拷贝到本地。这样之后直接在宿主机上修改就行,不用进容器。
docker cp nginx:/etc/nginx /root/nginx_config
docker cp nginx:/usr/share/nginx /root/nginx_website# 删除nginx容器
docker stop nginx && docker rm nginx# 重新创建nginx容器
# —network host表示共享主机网络。比如nginx conf里配置把某些路径转发给主机运行的flask处理,可以方便地直接用。如果不需要共享宿主机网络,也可以 -p 80:80 -p 443:443 开放两个端口
docker run -itd --name nginx --network host -v /root/nginx_config:/etc/nginx -v /root/nginx_website:/usr/share/nginx -v /root/nginx_logs:/var/log/nginx -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro nginx:1.27.4
在使用时,将每个站点组织为一个文件夹,放在宿主机/root/nginx_website/xxx
内,然后修改宿主机/root/nginx_config/conf.d
内的conf文件,修改root /usr/share/nginx/xxx
的xxx为对应的网页根目录即可。
mysql 8.0数据库服务
参考资料
# 下载镜像
docker pull mysql/mysql-server:8.0.32# 启动容器并拷贝环境,注意<root_password>要进行替换
mkdir -p /root/mysql/logs /root/mysql/conf
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=<root_password> mysql/mysql-server:8.0.32
docker cp mysql:/var/lib/mysql /root/mysql/data
docker stop mysql && docker rm mysql# 设置777权限,否则docker容器无法正常启动
chmod -R 777 /root/mysql/data
chmod -R 777 /root/mysql/logs# 简单配置一下
cat > /root/mysql/conf/my.cnf << EOF
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
authentication_policy=*[client]
default-character-set=utf8mb4[mysql]
default-character-set=utf8mb4
EOF# 启动正式环境(宿主机33060映射到容器内部3306),由于之前拷贝了data目录,这里不会重新初始化,密码就是之前设定的
docker run -d --name mysql --restart always -p 33060:3306 -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql -v /root/mysql/logs:/var/log -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro mysql/mysql-server:8.0.32# 由于docker容器内部网络独立,而默认的root@localhost用户会拒绝来自宿主机的连接,所以需要创建一个新的允许指定ip来源的用户。这里为了方便起见,使用root@%用户允许任何ip地址
docker exec -it mysql bash
mysql -uroot -p # 然后输入之前设置的root_password密码 随后可以用select user,host from mysql.user;查询已有用户
create user 'root'@'%' identified with mysql_native_password by '<root_password>';
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges;
# 删除用户时,使用 drop user 'root'@'%';## 以下为官方提供的指令,仅供参考,不需要执行
# 检查默认密码。如果启动容器时没有挂载data,可以执行下面的操作检查一下初始密码
docker logs mysql 2>&1 | grep GENERATED# 重置密码
docker exec -it mysql mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'some_new_passwd';
配置好后,如果需要迁移旧数据到这里,可以使用mysqldump进行导出,示例:
# 数据导出
mysqldump -u root -p --databases <database_name> -P <mysql_port> --add-drop-database --add-drop-table > xxx.sql
# 数据导入,首先需要创建空数据库,然后进行导入。这里直接把密码写在命令行里了
docker exec -it mysql mysql -uroot -p -e "create database if not exists <database_name>;"
docker exec -it mysql mysql -uroot -p<root_password> <database_name> < xxx.sql
# 除了在外部使用docker exec,比较推荐进容器内部进行导入
mysql> create database if not exists <database_name>;
mysql> use <database_name>;
mysql> source xxx.sql; # 需要提前docker cp把容器外的sql备份拷贝到容器内;或者用之前挂载的目录也行