前言
最近由于项目部署需要,简单学习了 docker 的使用和回顾下 CentOS 中的常用操作。
Docker 篇
由于 Shaun 此次需要安装的环境有点偏门,没找到有完全符合要求的镜像,同时也趁着这次机会学一下 docker,所以就还是直接从最开始的装起了。
首先使用 docker pull centos:7
拉取 CentOS7 的系统镜像,使用 docker images
查看已有的本地镜像信息,使用 docker ps -a
查看当前已有的容器信息,去掉参数 a ,即显示正运行的容器,docker stop [container id | name]
可关闭指定容器,docker start [container id | name]
可打开指定容器,docker rm [container id | name]
可删除指定容器,docker rmi [image id | name]
可删除指定镜像,再删除镜像之前需要先删除依赖该镜像的所有容器。
使用 docker run -dit -p 80:80 -p 8080:8080 --name CentOS7 centos:7 bash
开启一个新的容器,其中参数的意义为: -i: 交互式操作;-t: 终端;-d: 后台启动;-p: 设置主机的端口映射到容器内的端口;-name: 指定容器名称;最后的 bash 代表使用 bash 终端。在 windows 中直接使用 docker run 运行镜像时会出现 the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty' 的错误,前面加上 winpty 即可,即 winpty docker run ...
。当没有参数 d 时,则直接进入容器,而当存在参数 d 时,由于容器实在后台启动,进入容器时需要执行 docker exec -it [container id | name] bash
才能进入容器,而退出容器可以输入 exit
命令。
而为了在容器中可以开启后台服务,需要在开启容器时就进行提权,在 Windows 中提权命令为 docker run -dit --privileged=true --name CentOS7 centos:7 init
;而在 Linux 中提权命令为 docker run -dit --privileged=true --name CentOS7 centos:7 /usr/sbin/init
。
在新开启的容器中添加数据和相应的环境之后,即可使用 docker commit CentOS7 new_image:tag
生成一个新的镜像(生成镜像之前最好关闭容器),该镜像包含已经安装的环境和数据,再使用 docker save -o centos7.tar new_image:tag
,可将生成的镜像导出成 tar 包,在其他机器中使用 docker load -i centos7.tar
即可导入该 tar 包,并生成相应的镜像, 从而简单便捷的完成环境和数据迁移部署任务。
容器有时需要和主机之间传输文件,有两种方案,一种是直接采用共享文件夹的方式,设置某个目录为两系统的共享目录,从而实现文件传输;另一种是使用 docker cp 命令,使用 docker cp src_path container:dst_path
将主机的文件拷贝到容器中;使用 docker cp container:src_path dst_path
将容器的文件拷贝到主机中。
CentOS 篇
安装PostgreSQL12
1 | Install the repository RPM: |
由于需要切换账户,所以最好在第一步安装完之后就使用 passwd [username] XXXXXX
设置 root 和 postgres 两个账户的密码。
安装postgis
(https://yum.postgresql.org/12/redhat/rhel-7-x86_64/repoview/)
1 | 解决依赖 |
postgres 移除扩展 drop extension postgis cascade;
。
安装Java
(https://www.cnblogs.com/bcomll/p/12142747.html)
1 | 搜素java |
安装GeoServer
(https://blog.csdn.net/weixin_34205076/article/details/88734828)
1 | mv /tmp/geoserver-2.13.2 /usr/share/geoserver |
安装 nginx
1 | yum install nginx # 下载并安装nginx |
在 /etc/nginx 下可修改 nginx.config 文件,监听端口默认是 80,直接输入本地地址可能并打不开网页,因为直接这样安装的 nginx 的可能“有毒”,在 /usr/share/nginx/html 目录中 index.html 可能并不是一个 html 文件,而只是快捷方式,需要从别的地方拷贝一个真正的 index.html 文件替换该文件才可正常打开网页。
安装 nodejs
(https://github.com/nodesource/distributions)
1 | curl -sL https://rpm.nodesource.com/setup_10.x | bash - |
VSCode 远程篇
需要安装 VSCode 远程开发插件 https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack,包括(Remote - WSL,Remote - Containers,Remote - SSH)。
在远程资源资源管理器中 切换到 SSH Targes 标签,点击设置设置,在 C:/Users/用户名/.ssh/config 中输入
1 | Host [随便写] |
配置SSH,通过命令 ssh-keygen -t rsa -b 4096
生成密钥对(在 C:/Users/用户名/.ssh/ 目录中),将公钥内容拷贝到远程服务器/root/.ssh/authorized_keys
中,修改配置文件 /etc/ssh/sshd_config
,取消 #PubkeyAuthentication yes
注释,允许使用基于密钥认证的方式登录。重启 sshd 服务 systemctl restart sshd
。通过 VSCode ssh 远程连接在结束之后最好将终端全部删除,尤其是最开始的那个 install server 终端。
设置好SSH之后,通过在 VSCode 中设置 "docker.host":"ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
,可以直接连接在远程服务器上的 docker。该设置最好用于 工作区设置,而不是 用户设置。
VSCode 远程连接 SSH 有时可能会出现无法连接,一直尝试连接的现象,这时需要粗暴的删除 ~/.vscode-server 目录,重新进行连接,不行的话就只能参考: https://stackoverflow.com/questions/56718453/using-remote-ssh-in-vscode-on-a-target-machine-that-only-allows-inbound-ssh-co,先关闭远程服务器上已存在的所有 vscode-server 进程,通过 https://update.code.visualstudio.com/commit:$COMMIT_ID/server-linux-x64/stable
下载 tar 包,使用 tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1
后再重新连接。
后记
据查 docker 依然存在很多缺点,尤其是守护进程,Shaun 这两天在 Windows 中使用 Docker 也时不时的出现 docker 卡死的问题,需要重启 docker 服务, 以后有机会还是使用 Podman 吧。RedHat 系的 yum 也快退休了,以后再需要安装软件可能就直接上毒奶粉(bushi)dnf 了。VSCode 远程开发是真的舒服,文件无缝传输,任意修改,可以尽情享受现代编辑器的方便。