创建和启动容器而不使用docker-compose(Rocket.Chat部分)
当提到Docker时,人们通常会使用docker-compose,这已成为理所当然的事情。但我想更从基础开始学习!这是我想要的内容。
环境
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ docker --version
Docker version 1.13.1, build b2f74b2/1.13.1
由于sudo太麻烦,所以没有写。请帮我改写一下。
目录 (mù lù)
-
- Dockerインストール
Rocket.Chatを起動する
Rocket.Chatの構成を知る
mongoDBのDB領域を作る(Volume)
mongoDBのコンテナを作る
Rocket.Chatのコンテナを作る
Rocket.Chatを起動する
请使用中文将以下内容进行释义,只需要提供一种选项:
Please drive more slowly.
安装Docker
首先,确保主机服务器处于联机状态,不需要使用epel、ius等仓库扩展。
$ ping google.com -c 3
PING google.com (216.58.197.174) 56(84) bytes of data.
64 bytes from nrt12s02-in-f174.1e100.net (216.58.197.174): icmp_seq=1 ttl=49 time=59.7 ms
64 bytes from nrt12s02-in-f174.1e100.net (216.58.197.174): icmp_seq=2 ttl=49 time=50.1 ms
64 bytes from nrt12s02-in-f174.1e100.net (216.58.197.174): icmp_seq=3 ttl=49 time=47.6 ms
如果无法连接,您可以编辑/etc/resolv.conf或使用/sbin/ip route add default via xxx 来设置网关。
我们马上安装Docker。
虽然本节不涉及docker-compose,
但为了以后方便,我认为最好一开始就安装好。
$ yum install docker docker-compose
$ systemctl start docker
$ systemctl enable docker
接下来会毫不留情地关闭SELinux和firewalld。
如果能够熟练使用,是非常酷的呢。
$ getenforce
Enforcing
$ setenfoce 0
$ getenforce
Permissive
$ vim /etc/selinux/config
----------------------------------------------------------------------
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
- SELINUX=enforcing
+ SELINUX=disabled
# SELINUXTYPE= can take one of three values:
----------------------------------------------------------------------
$ systemctl stop firewalld
$ systemctl disable firewalld
当到达这一步,准备工作就完成了。
最后我们需要确认一下情况。
$ docker --version
Docker version 1.13.1, build b2f74b2/1.13.1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
请使用中文将以下内容进行改述,只需要给出一个选择:
– I am sorry, I cannot make it to the meeting tomorrow due to a sudden personal emergency.
启动Rocket.Chat
试试类似slack的聊天工具,启动Rocket.Chat。
请用中文进行原生态的改写,只需提供一种选项:
请改写以下句子:
“The cat is sleeping on the chair.”
改写选项:
猫正在椅子上睡觉。
了解 Rocket.Chat 的配置
用Docker Compose启动Rocket.Chat。
从以下两个图像中可以看出,Rocket.Chat是由以下两个图像组成的。
-
- Rocket.Chat 本体
- mongoDB
请用中文将下面的句子转述成同义句:
创建MongoDB的数据库卷 (Volume)
在主机服务器上创建一个用于存储MongoDB数据的空间。如果不这样做,聊天日志将只保存在容器内部,当容器被销毁时,日志也会消失。
通常情况下,我们会创建专用的LV,但由于会变得复杂,所以在这里省略了。
这次只是简单地在/var目录下创建一个目录。
$ mkdir -p /var/data/rocketchat_db
请将以下内容用中文母语进行改写,只需要提供一种选择:
请将以下内容用中文进行改写,只需提供一种选项:
创建一个MongoDB容器
我从 Docker Hub 上找到了 MongoDB 的镜像。
$ docker search mongo
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mongo MongoDB document databases provide high av... 5967 [OK]
docker.io docker.io/mongo-express Web-based MongoDB admin interface, written... 468 [OK]
docker.io docker.io/tutum/mongodb MongoDB Docker image ? listens in port 270... 226 [OK]
:
这次我们将使用官方镜像docker.io/mongo来使用Mongo。mongo:tag
在本文撰写时,mongo:3.4.21是最新版本。
使用docker pull命令获取镜像。
$ docker pull mongo:3.4.21
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mongo 3.4.21 0a8d98121dec 5 days ago 426 MB
在创建容器时,我们将从mongo:description中学习到mongoDB所需的选项。
从另一个Docker容器连接到MongoDB
据说MongoDB默认使用“27017”端口。
由于这次没有其他正在使用MongoDB的容器,所以我们将保持原样。
无需配置文件,可自定义配置。
如果使用”smallfiles”选项,可以在MongoDB中以较小的大小运行。
关于”小大小”的定义,请参考以下内容。
-
- MongoDBのjournalのファイルサイズが大きすぎる
- MongoDBでデータベースサイズが気になるとき
设置WiredTiger缓存大小限制
在MongoDB中,可以指定要使用的缓存大小。令人意外的是,似乎无法通过Docker功能来指定内存(–memory string)。
如果要进行实际运营,可能需要指定缓存大小。
这次我们将用–wiredTigerCacheSizeGB 1.5来将缓存设定为1.5GB。
这个预计是将内存和缓存总和控制在约2GB左右。
- MongoDBでメモリサイズを1G未満に設定する裏技
使用自定义的MongoDB配置文件
在主机服务器上准备MongoDB的配置文件也是可能的。
由于此次需要的选项都会在创建容器时通过参数传递,因此不需要准备任何东西。
环境变量
超级用户可以指定密码。
这仅在实例建立时有效,并且无法在之后更改。
我会试着按照以下的方式进行设置。
-e MONGO_INITDB_ROOT_USERNAME=rcadmin \
-e MONGO_INITDB_ROOT_PASSWORD=p@55w0rd
据说如果指定MONGO_INITDB_DATABASE,可以指定数据库名称,但是恐怕Rocket.Chat应用程序会创建数据库,所以这里不需要指定。
需要注意的是创建容器时的语法。
$ docker container create [オプション] image名 [COMMAND]
在使用docker命令时,选项需要在image之前指定。如果在image之后指定,则会被视为COMMAND。
大致上看起来就是这样了。
你应该去查看MongoDB的官方网站以获取更详细的信息。
根据上述内容,我们将按以下方式创建容器。
$ docker container create \
--name rocketchat_db \
--volume=/var/data/rocketchat_db:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=rcadmin \
-e MONGO_INITDB_ROOT_PASSWORD=p@55w0rd \
mongo:3.4.21 \
--smallfiles \
--wiredTigerCacheSizeGB 1.5
$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
555eb5e21cd6 mongo:3.4.21 "docker-entrypoint..." 9 seconds ago Created rocketchat_db
成功创建容器,一切正常。
请用中文转述以下内容,只需要提供一种选项:
The weather is very hot today and I am feeling tired.
创建一个Rocket.Chat容器
在Docker Hub上搜索Rocket.Chat的镜像。
$ docker search rocket.chat
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/rocket.chat The Complete Open Source Chat Solution 433 [OK]
docker.io docker.io/rocketchat/rocket.chat Official Rocket.Chat docker deployment ima... 170 [OK]
docker.io docker.io/rocketchat/rocket.chat.enterprise Rocket.Chat Enterprise 2
docker.io docker.io/monolitme/rocket.chat FIGapp customization to RocketChat 1 [OK]
:
观看在Qiita上发布的文章后发现大约三分之一的人使用了docker.io/rocketchat/rocket.chat。
看起来 Rocket.Chat 有两个可访问的公开频道。
-
- rocket.chat
- rocketchat/rocket.chat
由于docker.io/rocket.chat的官方文档更加详实,我们决定选择这个版本。
火箭聊天:标签
本文所指时间rocket.chat:1.1.2 是最新版本。
使用docker pull 命令来获取镜像。
$ docker pull rocket.chat:1.1.2
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/rocket.chat 1.1.2 a4180953b9e4 5 hours ago 696 MB
docker.io/mongo 3.4.21 0a8d98121dec 6 days ago 426 MB
在创建容器之前,我们从rocket.chat:description中学习到rocket.chat所要求的选项。
首先,启动一个Mongo实例。
這已經做過了所以跳過吧。
然后启动与这个Mongo实例连接的Rocket.Chat。
只需要在启动时链接到之前创建的MongoDB。
这将在容器上启动一个Rocket.Chat实例,监听默认的Meteor端口3000。
默认情况下,应该是3000端口。
由于没有特别的要求,我们将继续使用3000端口进行操作。
为了确保,我们决定明确地将主机的3000端口与容器的3000端口绑定,使用-p 3000:3000指令。
然后在浏览器中通过 http://localhost 访问它。如果您正在自己的域名上进行托管,请将 ROOT_URL 中的 localhost 替换为您自己的域名。
如果您正在使用第三方的Mongo提供商或与Kubernetes工作,则需要覆盖MONGO_URL环境变量。
如果使用k8s或第三方制造的mongoDB,似乎需要指定mongoDB的URL。
由于本次是在同一个docker主机上进行链接连接,所以不需要。
查找Rocket.Chat时,我发现选项比我想的少。
使用Docker Compose安装RocketChat并学习基本的使用方法(1/3)
当参考此文所述docker-compose的YAML文件时,
我们会按照以下方式提供环境变量。
rocketchat:
# コンテナイメージを指定(image:コンテナイメージ名:タグ名)
image: rocketchat/rocket.chat:latest
# 環境変数を設定
environment:
# MongoDB(db)のURLを指定
- MONGO_URL=mongodb://db:27017/rocketchat
# RocketChatのURL(ここではホスト名をlocalhostとしています)
- ROOT_URL=http://localhost
# アカウントのメールアドレスのドメインチェックを無効化
- Accounts_UseDNSDomainCheck=false
# MongoDB(db)へのリンクを指定
links:
- db:db
# RocketChatのポートを設定
ports:
- 3000:3000
这个ROOT_URL似乎是个问题。
这次我们将指定与主机服务器相同的IP地址。
根据上述内容,我们将按以下方式创建容器。
$ docker container create \
--name rocketchat \
-p 3000:3000 \
--link rocketchat_db \
-e ROOT_URL=http://192.168.10.100 \
rocket.chat:1.1.2
$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e408b03cc6e9 rocket.chat:1.1.2 "node main.js" 11 seconds ago Created rocketchat
555eb5e21cd6 mongo:3.4.21 "docker-entrypoint..." About a minute ago Created rocketchat_db
容器创建已顺利完成。
请用汉语将以下内容进行改述,只需要一个选项:
请注意我今天要说的关键点。
请注意关键点是我今天要谈论的重点。
请注意我今天要讨论的核心内容。
启动Rocket.Chat。
我将检查已创建的容器。
$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e408b03cc6e9 rocket.chat:1.1.2 "node main.js" 6 minutes ago Created rocketchat
555eb5e21cd6 mongo:3.4.21 "docker-entrypoint..." 7 minutes ago Created rocketchat_db
按照Rocket.Chat的手册,依次启动mongo和rocket.chat。
首先启动mongoDB。
$ docker container start rocketchat_db
$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e408b03cc6e9 rocket.chat:1.1.2 "node main.js" 7 minutes ago Created rocketchat
555eb5e21cd6 mongo:3.4.21 "docker-entrypoint..." 9 minutes ago Up 23 seconds 27017/tcp rocketchat_db
状态已更改为“上线”。
接下来启动Rocket.chat。
$ docker container start rocketchat
Error response from daemon: driver failed programming external connectivity on endpoint rocketchat (51314050dba540e3430e0685ec5b643b9e43c2a495e469b2154ee7760b6c7692): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3000 -j DNAT --to-destination 172.17.0.3:3000 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1))
Error: failed to start containers: rocketchat
发生了错误。我们需要确认内容。
看起来尝试使用iptables进行转发时失败了。
有人说,通过重启Docker守护进程,能够解决Docker容器由于iptables错误无法启动的问题。
$ docker container stop rocketchat_db
$ systemctl restart docker
$ docker ps -a
$ docker container start rocketchat_db
$ docker container start rocketchat
我会尝试启动确认。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e408b03cc6e9 rocket.chat:1.1.2 "node main.js" 19 minutes ago Exited (1) 3 minutes ago rocketchat
555eb5e21cd6 mongo:3.4.21 "docker-entrypoint..." 20 minutes ago Up 3 minutes 27017/tcp rocketchat_db
起動时没有出现错误,但已退出(1)。
似乎由于另一个问题无法启动。
我们尝试使用docker logs命令来确认标准输出。
$ docker logs rocketchat
/app/bundle/programs/server/node_modules/fibers/future.js:313
throw(ex);
^
MongoNetworkError: failed to connect to server [db:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND db db:27017]
at Pool.<anonymous> (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/topologies/server.js:564:11)
at emitOne (events.js:116:13)
at Pool.emit (events.js:211:7)
at Connection.<anonymous> (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/connection/pool.js:317:12)
at Object.onceWrapper (events.js:317:30)
at emitTwo (events.js:126:13)
at Connection.emit (events.js:214:7)
at Socket.<anonymous> (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/connection/connection.js:246:50)
at Object.onceWrapper (events.js:315:30)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at emitErrorNT (internal/streams/destroy.js:64:8)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
似乎在连接MongoDB方面出现了问题,报错为getaddressinfo ENOTFOUND db。
编辑Rocket.Chat容器创建时的–link选项。
将rocketchat_db容器识别为db,
–link rocketchat_db:db。
$ docker container rm rocketchat
$ docker container create \
--name rocketchat \
-p 3000:3000 \
--link rocketchat_db:db \
-e ROOT_URL=http://192.168.10.100 \
rocket.chat:1.1.2
$ docker container start rocketchat
$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a7f04dc0611 rocket.chat:1.1.2 "node main.js" About a minute ago Exited (1) 2 seconds ago rocketchat
052a9dd76d9a mongo:3.4.21 "docker-entrypoint..." 2 minutes ago Up 17 seconds 27017/tcp rocketchat_db
还不行。我会去检查一下日志。
$ docker logs rocketchat
/app/bundle/programs/server/node_modules/fibers/future.js:313
throw(ex);
^
MongoError: not authorized on meteor to execute command { listIndexes: "users", cursor: {} }
at queryCallback (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/cursor.js:248:25)
at /app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/connection/pool.js:532:18
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
先前的情况和记录不同。看起来向前推进了一点。
下面的日志是MongoDB上的错误。
由于未经授权,似乎在MongoDB上无法执行命令。
相关的是在MongoDB构建时指定的ROOT_USERNAME和ROOT_PASSWORD。
这一次我们尝试不指定它们并启动。
$ docker container stop rocketchat_db
$ docker container rm rocketchat_db
$ docker container rm rocketchat
$ docker container create \
--name rocketchat_db \
--volume=/var/data/rocketchat_db:/data/db \
mongo:3.4.21 \
--smallfiles \
--wiredTigerCacheSizeGB 1.5
$ docker container create \
--name rocketchat \
-p 3000:3000 \
--link rocketchat_db:db \
-e ROOT_URL=http://192.168.10.100 \
rocket.chat:1.1.2
$ docker container start rocketchat_db
$ docker container start rocketchat
$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ada86161fc8b rocket.chat:1.1.2 "node main.js" 37 seconds ago Up 7 seconds 0.0.0.0:3000->3000/tcp rocketchat
91bee011502c mongo:3.4.21 "docker-entrypoint..." 3 minutes ago Up 2 minutes 27017/tcp db
555eb5e21cd6 mongo:3.4.21 "docker-entrypoint..." 52 minutes ago Exited (0) 11 minutes ago rocketchat_db
我成功启动了,然后尝试从浏览器访问”http://192.168.10.100:3000″。
然而,没有收到回应。
似乎仍然存在问题。
我会检查Rocket.Chat的日志。
$ docker logs rocketchat
? server.js:207 System ? error
? +---------------------------------------------------------------------------+
? | SERVER ERROR |
? +---------------------------------------------------------------------------+
? | |
? | Rocket.Chat Version: 1.1.2 |
? | NodeJS Version: 8.11.4 - x64 |
? | MongoDB Version: 3.4.21 |
? | MongoDB Engine: wiredTiger |
? | Platform: linux |
? | Process Port: 3000 |
? | Site URL: http://192.168.10.100 |
? | ReplicaSet OpLog: Disabled |
? | Commit Hash: aece97e1a0 |
? | Commit Branch: HEAD |
? | |
? | OPLOG / REPLICASET IS REQUIRED TO RUN ROCKET.CHAT, MORE INFORMATION AT: |
? | https://go.rocket.chat/i/oplog-required |
? | |
? +---------------------------------------------------------------------------+
有一条很酷的日志出现了。
OPLOG / REPLICASET IS REQUIRED TO RUN ROCKET.CHAT, MORE INFORMATION AT:
这看起来很可疑。
我会检查错误对话框中指定的URL。
https://rocket.chat/docs/installation/manual-installation/mongo-replicas/
Rocket.Chat 使用 MongoDB 副本集通过 Meteor Oplog 追踪来提高性能。
似乎需要使用复制集。
通过指定 –replSet rs1 来启动 MongoDB,以复制集的形式运行。
启动MongoDB shell并初始化副本集。
需要登录MongoDB并初始化复制集。在MongoDB的手册中提到了这方面的内容。
命令的输出应该像这样:
请注意,“ok”值应该是1。任何其他值,例如93,都表示有问题。
如果ok的值变为1,听说就没问题了。
重新配置并重启Rocket.Chat服务
在配置副本集后,您必须将MONGO_OPLOG_URL环境变量添加到服务定义中,并重新启动Rocket.Chat服务器。
在准备好复制集后,需要在Rocket.Chat的环境变量中设置MONGO_OPLOG_URL。MONGO_OPLOG_URL的设置如下所示。
MONGO_OPLOG_URL=mongodb://localhost:27017/local?replSet=rs01
我们可以将localhost理解为mongoDB,命名为rocketchat_db。
当然,也可以取名为db。
首先,我们将删除Rocket.Chat和mongoDB。
$ docker container stop rocketchat
$ docker container stop rocketchat_db
$ docker container rm rocketchat
$ docker container rm rocketchat_db
$ rm -rf /var/data/rocketchat_db/*
接着启动具有复制集的DB。
$ docker container create \
--name rocketchat_db \
--volume=/var/data/rocketchat_db:/data/db \
mongo:3.4.21 \
--smallfiles \
--wiredTigerCacheSizeGB 1.5 \
--replSet rs1
$ docker container start rocketchat_db
在这里,我们将连接到数据库并初始化副本集。
然而,由于主机服务器上没有Mongo数据库,因此无法进行客户端连接。
由於無法避免,我們將通過docker exec連接到容器,並從容器內部連接到mongoDB。
$ docker exec -it rocketchat_db /bin/bash
root@161ebb19a7bd:/# mongo
> rs.status()
{
"info" : "run rs.initiate(...) if not yet done for the set",
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized"
}
代号:NotYetInitialized 表示尚未初始化。
这里将初始化副本集。
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "161ebb19a7bd:27017",
"ok" : 1
}
根据之前的调查结果,一切都很顺利,所以看起来应该没问题。
rs1:SECONDARY> rs.status()
{
"set" : "rs1",
"date" : ISODate("2019-06-19T07:06:28.872Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1560927987, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1560927987, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1560927987, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "161ebb19a7bd:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1740,
"optime" : {
"ts" : Timestamp(1560927987, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-06-19T07:06:27Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1560927985, 2),
"electionDate" : ISODate("2019-06-19T07:06:25Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1
}
> exit
root@161ebb19a7bd:/# exit
接下来,启动Rocket.Chat。
$ docker container create \
--name rocketchat \
-p 3000:3000
--link rocketchat_db:db \
-e ROOT_URL=http://192.168.10.100 \
-e MONGO_OPLOG_URL=mongodb://rocketchat_db:27017/local?replSet=rs1 \
rocket.chat:1.1.2
$ docker container start rocketchat
$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aead98b431c5 rocket.chat:1.1.2 "node main.js" About an hour ago Up About an hour 0.0.0.0:3000->3000/tcp rocketchat
9a507773cfe9 mongo:3.4.21 "docker-entrypoint..." About an hour ago Up About an hour 27017/tcp rocketchat_db
我能够顺利地从浏览器进行访问。
为了保险起见,我也会检查Rocket.Chat的日志。
$ docker logs rocketchat
? +----------------------------------------------+
? | SERVER RUNNING |
? +----------------------------------------------+
? | |
? | Rocket.Chat Version: 1.1.2 |
? | NodeJS Version: 8.11.4 - x64 |
? | MongoDB Version: 3.4.21 |
? | MongoDB Engine: wiredTiger |
? | Platform: linux |
? | Process Port: 3000 |
? | Site URL: http://192.168.10.100 |
? | ReplicaSet OpLog: Enabled |
? | Commit Hash: aece97e1a0 |
? | Commit Branch: HEAD |
? | |
? +----------------------------------------------+
成功启动了,没有任何问题。