项目中Docker使用总结

275 阅读12分钟

部署环境准备

安装centos7系统后,只包含了很少的工具包。

首先给yum换源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

查看ip地址

ipaddr或者ifconfig

ifconfig的运行需要net-tools工具包

yum install -y net-tools

读入u盘需要ntfs-3g包,换源后的yum可以直接下载

yum install -y ntfs-3g

挂载u盘

fdisk -l
mount -t ntfs-3g /dev/sdb1 /mnt

另外一些常用命令

tar -czvf ...tar.gz . #压缩当前文件夹
tar -xzvf ...tar.gz /home/... #解压某个文件到/home/...
ps -ef |grep xxx #查找xxx的运行状态,包含进程号
kill pid #杀死某个进程
curl www.baidu.com #访问baidu网站,一般会返回首页html,也可用于代替ping命令
cp -r #复制文件夹及其全部子文件
chmod -R xxx #给某文件夹及其全部子文件赋权限

系统部署阶段

本次项目运行在centos7系统上,用到的镜像包有

  • mysql.tar :项目中用于部分数据持久化,如登录用户,已爬取的新闻
  • kgtwitter.tar :项目中用于爬取twitter中敏感人物组织事件信息
  • neo4j.tar :项目中用于持久化非结构化数据,如人物组织事件等信息以及他们之间的关系
  • tomcat.tar :部署javaweb项目,解压war包,并运行
  • kgqa.tar :问答系统
  • scu_crwal.tar :爬虫模块
  • kgextract.tar :在某些新闻网站爬取敏感人物组织事件信息,另一个爬虫模块

可惜,这些镜像包都不是我写的

不过,可以查看这些镜像的制作步骤 docker history mysql:5.6.31 给大家看一下部署目录

路径作用
firstStep.sh和secondStep.sh为了方便部署,把部署需要做的准备工作都写在了这里
iamges存放着各大镜像包
kgabs存放着启动kgextreact容器的启动文件
Kg_Auto存放了启动scu_crwal的启动文件
kg_mysql存放了.sql格式的数据库文件
KGMultiMedia存放了项目需要的多媒体文件
kgqa存放着启动kgqa容器的启动文件
neoData存放着neo4j的数据库文件
webappstomcat的工作目录,放着已经打好的工程war包。

firstStep.sh

echo "installing docker"
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
yum install -y docker-ce
service docker start
systemctl enable docker #设置开机自启动
echo "installation finished"
cur_path=`pwd` #保存当前目录

#导入镜像包,导出用docker save > 路径
echo "starting import"
docker load < ${cur_path}/images/mysql.tar
echo "kgmysql.tar imported!!!"
docker load < ${cur_path}/images/kgtwitter.tar
echo "kgtwitter.tar imported!!!"
docker load < ${cur_path}/images/neo4j.tar
echo "neo4j.tar imported!!!"
docker load < ${cur_path}/images/tomcat.tar
echo "tomcat.tar imported!!!"
docker load < ${cur_path}/images/kgqa.tar
echo "kgqa.tar imported!!!"
docker load < ${cur_path}/images/scu_crawl.tar
echo "scu_crwal.tar imported!!!"
docker load < ${cur_path}/images/kgextract.tar
echo "kgextract.tar imported!!!"

#这一小部分用于导入sql数据,具体方式是根据mysql的镜像包导入后重新生成一个新的镜像包
#以后开启的就是带有数据的镜像包
cd ./kg_mysql/
./start.sh
cd ${cur_path}/

#创建docker容器互通的网络,其实可以不用指定ip,用名字来互相访问
echo "starting create network"
docker network create --subnet 192.193.0.0/24 --gateway 192.193.0.1 kgnet
echo "creating network finished,gateway: 192.193.0.1 "

#启动容器
echo "starting container kgMysql..."
docker run -d -p 3306:3306 --name kgMysql  --net kgnet --ip 192.193.0.2   --restart always kg_mysql
echo "kgMysql started successfully, starting kgNeo4j..."
#启动neo4j需要赋权限为最大,不然容易报错
chmod 777 -R ${cur_path}/neoData/
chmod 777 -R ${cur_path}/KGMultiMedia/
#挂载必带--priviledged=true,这里每次换新机器部署就出错,一定要带上,而且要带在-v命令后
docker run -d -p 7474:7474 -p 7687:7687 -v ${cur_path}/neoData/:/var/lib/neo4j/data/databases/ --net kgnet --ip 192.193.0.3  --privileged=true --name kgNeo4j --restart always neo4j:3.4
echo "kgNeo4j started successfully, please replace the password of neo4j by http://localhost:7474/browser/"
#为了不影响tomcat的运行,必须先改好密码,程序中已经写好了

secondStep.sh

cur_path=`pwd`
echo "starting kgabs container..."
docker run -itd -p 8081:8081 --net kgnet --ip 192.193.0.4  --name kgabs -v ${cur_path}/kgabs/:/home --privileged=true --restart always kgextract /bin/bash /home/start_crawl.sh
echo "kgabs started sucessfully, starting container kgtwitter..."
docker run -d -p 8083:8083 --name kgtwitter --net kgnet --ip 192.193.0.5 --restart always kg_twitter
echo "kgtwitter started sucessfully, starting container kgqa..."
docker run -d -v ${cur_path}/kgqa/package/:/code/package/ --privileged=true -p 8086:8086 --net kgnet --ip 192.193.0.6  --name kgqa --restart always kgqa:1.0
echo "kgqa started sucessfully, starting container tomcat..."
docker run -d -p 8080:8080 --name tomcat  --net kgnet --ip 192.193.0.7  --restart always -v ${cur_path}/webapps:/usr/local/tomcat/webapps -v ${cur_path}/KGMultiMedia/:/KGMultiMedia/  --privileged=true tomcat:9.0.30-jdk8-adoptopenjdk-hotspot

docker run --net host -v ${cur_path}/Kg_Auto/:/home --privileged=true --restart always --name craw_install  -itd scu_crawl /bin/bash /home/package/start_crawl.sh
echo "deployment finished !"

部署完成

系统测试阶段

docker ps查看各个容器运行状况 全部运行成功是最理想的状态,总有一些容器运行失败,这时我们需要查看日志,有以下几种方法

docker logs 容器id

此种方法有时候日志并不能及时打印

docker run -it  [options] 容器id

此种方法在运行时查看日志,也就是有交互的运行容器,如果加入bash代表运行并进入容器命令行,此种方法能及时查看容器日志,但退出容器会关闭

docker attach --sig-proxy 容器id

此种方法能及时查看日志,退出时并不会关闭容器

可以根据日志内容进行debug

查看网络命令

docker network ls

查看某个网络的细节内容

docekr inspect kgnet

如下:

[
    {
        "Name": "kgnet",
        "Id": "234cc76dc6e454e8c40f14b7548d16f9765849533bb6b32d16661d4ee58af87f",
        "Created": "2020-08-01T22:23:19.630335841+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.193.0.0/24",
                    "Gateway": "192.193.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "007d607f7fce02f3c6e3f6fd928b32d9028f5168f0e7420a78931ba996f6c376": {
                "Name": "kgMysql",
                "EndpointID": "19ecee27dc8031c5e89ce9ecfc80d2fb0dae0c15ca1f6d2b451a846b04787f4f",
                "MacAddress": "02:42:c0:c1:00:02",
                "IPv4Address": "192.193.0.2/24",
                "IPv6Address": ""
            },
            "3973e6d5c19f1bbc7596a34552f0b53117d088bb20e8f6eb78ac613c4a6124b7": {
                "Name": "kgtwitter",
                "EndpointID": "62df6633215b4cdfe933af9092c937e85a9d20b8779c4cea0eab967955f12495",
                "MacAddress": "02:42:c0:c1:00:05",
                "IPv4Address": "192.193.0.5/24",
                "IPv6Address": ""
            },
            "699e38334cf94efd0bae04ff78c0caef29e66075938a72fbb26dacf0314fc530": {
                "Name": "kgNeo4j",
                "EndpointID": "2e16db834cc0ddb23812086b72c8095056f30ae5d8c3d7087a6a99b31fda16ef",
                "MacAddress": "02:42:c0:c1:00:03",
                "IPv4Address": "192.193.0.3/24",
                "IPv6Address": ""
            },
            "7213cc6945745c872769b55516c53510c4646aee613f22e234816ccb73b1a00f": {
                "Name": "tomcat",
                "EndpointID": "331bafa45ef236d5d9763941ec83eaa752f09ba7c13c49f73eef2ff16c39b634",
                "MacAddress": "02:42:c0:c1:00:07",
                "IPv4Address": "192.193.0.7/24",
                "IPv6Address": ""
            },
            "a83b3e3c5b080c865e90ce4509a3514f736818bc0e47ea837e7606d0d3a8e64a": {
                "Name": "kgabs",
                "EndpointID": "6135f3028354afa8b76c6dd694d3ad6057fb8dbb450f5d76e414ce1f7f0ad5ad",
                "MacAddress": "02:42:c0:c1:00:04",
                "IPv4Address": "192.193.0.4/24",
                "IPv6Address": ""
            },
            "b1cf119c0100f80eedc6636372f85c2136500dc6a6593de6079a1bc26198e249": {
                "Name": "kgqa",
                "EndpointID": "3a99c594b557d7269388144c3597056ee92b08290bd384426cb7b2f25fc580ac",
                "MacAddress": "02:42:c0:c1:00:06",
                "IPv4Address": "192.193.0.6/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

可以看到以上六个开启的容器都在这个“局域网”之下,他们是互联的,我甚至可以在tomcat容器内部去ping mysql容器

还可以查看容器的细节

docker inspect tomcat
[root@502Server kgOld]# docker inspect tomcat
[
    {
        "Id": "7213cc6945745c872769b55516c53510c4646aee613f22e234816ccb73b1a00f",
        "Created": "2020-08-01T14:24:09.028871075Z",
        "Path": "catalina.sh",
        "Args": [
            "run"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 23940,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-08-05T07:32:08.075131497Z",
            "FinishedAt": "2020-08-05T07:32:01.518944135Z"
        },
        "Image": "sha256:a5a21a07a43992eece885cb577751ae00824b602801e8988fc1a43a0d9bce9d7",
        "ResolvConfPath": "/var/lib/docker/containers/7213cc6945745c872769b55516c53510c4646aee613f22e234816ccb73b1a00f/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/7213cc6945745c872769b55516c53510c4646aee613f22e234816ccb73b1a00f/hostname",
        "HostsPath": "/var/lib/docker/containers/7213cc6945745c872769b55516c53510c4646aee613f22e234816ccb73b1a00f/hosts",
        "LogPath": "/var/lib/docker/containers/7213cc6945745c872769b55516c53510c4646aee613f22e234816ccb73b1a00f/7213cc6945745c872769b55516c53510c4646aee613f22e234816ccb73b1a00f-json.log",
        "Name": "/tomcat",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/home/liang/Downloads/kglatest/kgOld/webapps:/usr/local/tomcat/webapps",
                "/home/liang/Downloads/kglatest/kgOld/KGMultiMedia/:/KGMultiMedia/"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "kgnet",
            "PortBindings": {
                "8080/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8080"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": true,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": [
                "label=disable"
            ],
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": null,
            "ReadonlyPaths": null
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/9ec7257bafedc0cb23f26b5ea3183cb91ed223c5f0ecbfd634b286b4b17ea81d-init/diff:/var/lib/docker/overlay2/1847e3c0bf8c2dcb9af53aa886b3d4e8a88b0e4438d1bc90c2ab3cfb5587917a/diff:/var/lib/docker/overlay2/47a0f8fa94d8e5f66fc33af6d925f2754bf473eef00871edc0290c3343625ade/diff:/var/lib/docker/overlay2/6c364eeca868c0b72b301dc3692f5fef40fd12ed880a71ce221bf140c20dcbc0/diff:/var/lib/docker/overlay2/e98f521e8683d5ede9533c1fc6b3cd8dfff5a7422fdf35a85ea9a0dda98eaf11/diff:/var/lib/docker/overlay2/46a58762146162d02ce99b7af032925b35a919efc52e93493399729aaf53a57e/diff:/var/lib/docker/overlay2/3a195192e60d8c089290475e15d69ca4a0706f76c6462d302a731ab49f3891b0/diff:/var/lib/docker/overlay2/77a6673707aa2dba34be2ce13167e35409eada0833c7c73fc54a9a2a324c7282/diff:/var/lib/docker/overlay2/33008aa4612d97102c6a018ac2cb41dbfc63d3bf6a753f33ec39fabd28771145/diff:/var/lib/docker/overlay2/e4204b2c473b43901f7d69f71bde1d57bbb8cd13ed5b747b06b1f6eae4a98ea4/diff",
                "MergedDir": "/var/lib/docker/overlay2/9ec7257bafedc0cb23f26b5ea3183cb91ed223c5f0ecbfd634b286b4b17ea81d/merged",
                "UpperDir": "/var/lib/docker/overlay2/9ec7257bafedc0cb23f26b5ea3183cb91ed223c5f0ecbfd634b286b4b17ea81d/diff",
                "WorkDir": "/var/lib/docker/overlay2/9ec7257bafedc0cb23f26b5ea3183cb91ed223c5f0ecbfd634b286b4b17ea81d/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/liang/Downloads/kglatest/kgOld/KGMultiMedia",
                "Destination": "/KGMultiMedia",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/home/liang/Downloads/kglatest/kgOld/webapps",
                "Destination": "/usr/local/tomcat/webapps",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "7213cc694574",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/tomcat/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=en_US.UTF-8",
                "LANGUAGE=en_US:en",
                "LC_ALL=en_US.UTF-8",
                "JAVA_VERSION=jdk8u232-b09",
                "JAVA_HOME=/opt/java/openjdk",
                "CATALINA_HOME=/usr/local/tomcat",
                "TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
                "LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
                "GPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23",
                "TOMCAT_MAJOR=9",
                "TOMCAT_VERSION=9.0.30",
                "TOMCAT_SHA512=40bf428a534816317e5e8732b679e6d73f6ed977aab4ac5e2b9eaf1eb087eaa68a18b0fd3da8c39ca4b96f5b6fd919dec84517abba0d5e797285ade934a92990"
            ],
            "Cmd": [
                "catalina.sh",
                "run"
            ],
            "Image": "tomcat:9.0.30-jdk8-adoptopenjdk-hotspot",
            "Volumes": null,
            "WorkingDir": "/usr/local/tomcat",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "53d2677a4ab57f683a502f744a3a8906031ec4915b405b307319d32ba26dd471",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8080/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8080"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/53d2677a4ab5",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "kgnet": {
                    "IPAMConfig": {
                        "IPv4Address": "192.193.0.7"
                    },
                    "Links": null,
                    "Aliases": [
                        "7213cc694574"
                    ],
                    "NetworkID": "234cc76dc6e454e8c40f14b7548d16f9765849533bb6b32d16661d4ee58af87f",
                    "EndpointID": "331bafa45ef236d5d9763941ec83eaa752f09ba7c13c49f73eef2ff16c39b634",
                    "Gateway": "192.193.0.1",
                    "IPAddress": "192.193.0.7",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:c0:c1:00:07",
                    "DriverOpts": null
                }
            }
        }
    }
]

可以看到这个容器的各种配置。 后面会出关于dockerfile的制作操作,因为又有项目要在linux上部署了。