Docker使用小结

前言

  最近由于项目部署需要,简单学习了 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

CentOS安装PostgreSQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Install the repository RPM:
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# Install PostgreSQL:
yum install -y postgresql12-server

# Optionally initialize the database and enable automatic start:
/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12

#开启远程访问
修改/var/lib/pgsql/10/data/postgresql.conf文件,
取消 listen_addresses 的注释,将参数值改为“*”

修改/var/lib/pgsql/10/data/pg_hba.conf文件,增加下
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5

# 给数据库postgres用户分配密码 1
psql -U postgres
alter user postgres with encrypted password '1';

# 重启服务
systemctl restart postgresql-12

由于需要切换账户,所以最好在第一步安装完之后就使用 passwd [username] XXXXXX 设置 root 和 postgres 两个账户的密码。

安装postgis

(https://yum.postgresql.org/12/redhat/rhel-7-x86_64/repoview/)

1
2
3
4
5
6
7
8
9
10
11
12
# 解决依赖
yum install epel-release

yum install -y https://yum.postgresql.org/12/redhat/rhel-7-x86_64/postgis30_12-3.0.2-2.rhel7.x86_64.rpm

# 安装pgrouting
yum install -y https://yum.postgresql.org/12/redhat/rhel-7-x86_64/pgrouting_12-3.0.2-1.rhel7.x86_64.rpm

# 安装ogr_fdw
yum search ogr_fdw # 查询
yum install ogr_fdw # 安装

postgres 移除扩展 drop extension postgis cascade;

安装Java

(https://www.cnblogs.com/bcomll/p/12142747.html)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 搜素java
yum search java | grep -i --color JDK

#安装
yum install java-11-openjdk

# 配置环境变量
vi /etc/profile
# 加入内容
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.8.10-0.el7_8.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/dt.jar:$JAVA_HOME/lib/tool.jar
export PATH=$PATH:$JAVA_HOME/bin

# 重启环境
source /etc/profile

安装GeoServer

(https://blog.csdn.net/weixin_34205076/article/details/88734828)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
mv /tmp/geoserver-2.13.2 /usr/share/geoserver

### 添加环境变量
vi /etc/profile
# 追加
export GEOSERVER_HOME=/usr/share/geoserver
# 重新加载/etc/profile文件
source /etc/profile

# 授权
chown -R root:root /usr/share/geoserver

#### 改造启动脚本
vim /usr/share/geoserver/bin/startup.sh

# 在最上面引入环境变量
source /etc/profile

# 最后执行改为nohup,并将日志输入到 var/log/geoserver.log
nohup "$_RUNJAVA" $JAVA_OPTS $MARLIN_ENABLER -DGEOSERVER_DATA_DIR="$GEOSERVER_DATA_DIR" -Djava.awt.headless=true -DSTOP.PORT=8079 -DSTOP.KEY=geoserver -jar start.jar 1>/dev/null 2>/var/log/geoserver.log &

#### 修改停止脚本
vim /usr/share/geoserver/bin/shutdown.sh
# 在最上面引入环境变量
source /etc/profile

#### 创建服务
vim /lib/systemd/system/geoserver.service

[Unit]
Description=geoserver service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/usr/share/geoserver/bin/startup.sh
ExecReload=
ExecStop=/usr/share/geoserver/bin/shutdown.sh
Restart=on-abort

[Install]
WantedBy=multi-user.target


## 开机自启
systemctl enable geoserver
## 开启服务
systemctl start geoserver

安装 nginx

1
2
3
yum install nginx # 下载并安装nginx

systemctl start nginx # 启动nginx服务

  在 /etc/nginx 下可修改 nginx.config 文件,监听端口默认是 80,直接输入本地地址可能并打不开网页,因为直接这样安装的 nginx 的可能“有毒”,在 /usr/share/nginx/html 目录中 index.html 可能并不是一个 html 文件,而只是快捷方式,需要从别的地方拷贝一个真正的 index.html 文件替换该文件才可正常打开网页。

安装 nodejs

(https://github.com/nodesource/distributions)

1
2
3
curl -sL https://rpm.nodesource.com/setup_10.x | bash -

yum install -y nodejs

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
2
3
Host [随便写]
HostName remote-ip 或 域名
User 远程服务器用户名

  配置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 远程开发是真的舒服,文件无缝传输,任意修改,可以尽情享受现代编辑器的方便。