首页
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
49,451 阅读
2
linuxea:如何复现查看docker run参数命令
23,044 阅读
3
Graylog收集文件日志实例
18,580 阅读
4
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
18,275 阅读
5
git+jenkins发布和回滚示例
18,181 阅读
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
elk
linux基础
nginx
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
gitops
jenkins
docker-compose
Istio
haproxy
saltstack
marksugar
累计撰写
690
篇文章
累计收到
139
条评论
首页
栏目
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
页面
About Me
推荐
weibo
github
搜索到
12
篇与
的结果
2021-12-18
linuxea:docker-compose2和3的常用参数和资源限制
通常我们在编排一个容器的时候,最简单的方式就是使用docker-compose,compose是简单的将docker run的命令进行组织起来。而在docker早期的产品里面compose被收购后是很重要的一个环节。当我们run一个容器的时候,一般而言,我们关注她的网络,持久化,资源情况以rabbitmq为例,如下:2.4version: '2.4' services: rabbitmq: image: rabbitmq:3.7.7-management container_name: rabbitmq restart: always hostname: "rabbitmqA" network_mode: "host" environment: - RABBITMQ_ERLANG_COOKIE="DSSOQQK1" - RABBITMQ_DEFAULT_USER=linuxea - RABBITMQ_DEFAULT_PASS=DSSOQQK1PASSWORD - RABBITMQ_DEFAULT_VHOST="/" volumes: - /data/rabbitmq/data:/var/lib/rabbitmq - /data/rabbitmq/rabbitmq_delayed_message_exchange-3.8.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.8.0.ez mem_limit: 2048m如上,我们关注几个配置项目restart: always: 配置了容器重启策略,如果不配置此项,在docker被重启后,容器未必会被拉起。container_name: 运行的容器命名hostname: 容器的主机名network_mode: 当被配置"host"的时候,docker不会隔离网络名称空间,这是最简单粗暴也有效的方式。我喜欢这样使用,特别是在你用iptables的时候mem_limit: 在2.4的版本中mem_limit是用来限制内存大小的选项,不限制则使用所有了3[root@test rabbitmq]# docker stats rabbitmq CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 5c1aed8e7ce5 rabbitmq 0.00% 42.66MiB / 2GiB 2.08% 0B / 0B 0B / 32.8kB 433version: '3' services: rabbitmq: image: rabbitmq:3.7.7-management container_name: rabbitmq restart: always hostname: "rabbitmqA" network_mode: "host" environment: - RABBITMQ_ERLANG_COOKIE="DSMAOMOXML" - RABBITMQ_DEFAULT_USER=mark - RABBITMQ_DEFAULT_PASS=E4OWYyNj11SXOA - RABBITMQ_DEFAULT_VHOST="/" volumes: - /data/rabbitmq/data:/var/lib/rabbitmq - /data/rabbitmq/rabbitmq_delayed_message_exchange-3.8.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.8.0.ez deploy: resources: limits: cpus: '0.5' memory: 2048m reservations: cpus: '1' memory: 2048m而在compose3版本中更倾向对集群的使用了,从而资源限制的方式也变了。2.4到3版本并不是一个2.4到3的平滑升级,3对于docker公司来说是另外一个商业计划。这样来理解,相信你已经明白了 deploy: resources: limits: cpus: '0.5' memory: 2048m reservations: cpus: '1' memory: 2048m如上,我们在限制内存的时候使用的是0.5。要理解CPU限制为什么是0.5CPUS,以及了解CFS调度。我们最快的方式查看docker官网的configure-the-default-cfs-scheduler解释--cpus=: 指定容器可以使用多少可用 CPU 资源。例如,如果主机有两个 CPU 并且您设置了--cpus="1.5",则容器最多保证一个半 CPU。这相当于设置--cpu-period="100000"和--cpu-quota="150000"。如果你只有1个CPU,配置是0.5的时候,就是使用一半的CPU,50%,1个CPU的整个是100%CPU的限制实际上有很多,你甚至可以限制它运行在某一颗上另外,之所以内存的reservations和limits是一样,是为了减少内存回收可能产生的比必要的问题,所以请求和限制设置是一样的。而CPU我们是可压缩的,所以我们可以灵活的进行配置https://docs.docker.com/compose/compose-file/compose-file-v2/#restart[root@test rabbitmq]# docker stats rabbitmq CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a46e89266a99 rabbitmq 0.00% 102.3MiB / 2GiB 5.00% 0B / 0B 0B / 90.1kB 162 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a46e89266a99 rabbitmq 0.00% 102.3MiB / 2GiB 5.00% 0B / 0B 0B / 90.1kB 162 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a46e89266a99 rabbitmq 0.13% 102MiB / 2GiB 4.98% 0B / 0B 0B / 90.1kB 162
2021年12月18日
2,054 阅读
0 评论
0 点赞
2019-03-02
linuxea:docker config的配置使用
使用Docker Config而不是使用嵌入式配置创建镜像怎么样?在镜像中嵌入配置?我们经常看到Dockerfile如下所示,其中创建新镜像只是为了将配置添加到基本镜像。$ cat Dockerfile FROM marksugar:redis:5.0.0 RUN curl http:/xx/x/xredis.conf -o /etc/redis/redis.conf在上述中,是将最新的redis.conf文件放到/etc/redis/redis.conf中除此之外,我们还可以使用变量替换的方式进行处理。变量替换意味着需要设计模板和参数,如果参数过多,配置和替换起来将会耗费更多的时间,也较为复杂,并不是最好最安全的方式。当然,我们可以直接挂载文件到容器中,那并不优雅,但的确能解决一部分问题。如果需要频繁的修改文件,且变量替换也无法满足,也不想挂载文件,那现在就可以参考本节的docker config。阅读本章,你将了解docker config的简单使用和docker swarm的简单使用。使用场景有一个配置redis.conf的配置文件在容器内,现在我将容器内的配置文件修改后重新附加到容器内。我修改了密码字段:masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com" requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com"config创建现在,使用Docker CLI,我们可以从此配置文件创建配置redis.conf(redis.conf文件此前准备好的配置),我们将此配置命名为redis。[root@linuxea.com /opt/2019/redis]# docker config create redis redis.conf 269yklanwzva9yk74n6b3j9dk然后我们可以检查配置,就像我们对其他任何Docker一样:[root@linuxea.com /opt/2019/redis]# docker config inspect redis [ { "ID": "269yklanwzva9yk74n6b3j9dk", "Version": { "Index": 24 }, "CreatedAt": "2019-03-02T02:36:19.257840639Z", "UpdatedAt": "2019-03-02T02:36:19.257840639Z", "Spec": { "Name": "redis", "Labels": {}, "Data": "YmluZCAwLjAuMC4wDQpwcm90ZWN0ZWQtbW9kZSB5ZXMNCnBvcnQgNjM3OQ0KdGNwLWJhY2tsb2cgNTExDQp0aW1lb3V0IDANCnRjcC1rZWVwYWxpdmUgMzAwDQpkYWVtb25pemUgbm8NCnN1cGVydmlzZWQgbm8NCnBpZGZpbGUgL3Zhci9ydW4vcmVkaXNfNjM3OS5waWQNCmxvZ2xldmVsIG5vdGljZQ0KbG9nZmlsZSAiL2RhdGEvbG9ncy9yZWRpc182Mzc5LmxvZyINCmRhdGFiYXNlcyAxNg0KYWx3YXlzLXNob3ctbG9nbyB5ZXMNCnNhdmUgOTAwIDENCnNhdmUgMzAwIDEwDQpzYXZlIDYwIDEwMDAwDQpzdG9wLXdyaXRlcy1vbi1iZ3NhdmUtZXJyb3IgeWVzDQpyZGJjb21wcmVzc2lvbiB5ZXMNCnJkYmNoZWNrc3VtIHllcw0KZGJmaWxlbmFtZSBkdW1wLnJkYg0KZGlyICIvZGF0YS9yZWRpcyINCnJlcGxpY2Etc2VydmUtc3RhbGUtZGF0YSB5ZXMNCnJlcGxpY2EtcmVhZC1vbmx5IHllcw0KcmVwbC1kaXNrbGVzcy1zeW5jIG5vDQpyZXBsLWRpc2tsZXNzLXN5bmMtZGVsYXkgNQ0KcmVwbC1kaXNhYmxlLXRjcC1ub2RlbGF5IG5vDQpyZXBsaWNhLXByaW9yaXR5IDEwMA0KbGF6eWZyZWUtbGF6eS1ldmljdGlvbiBubw0KbGF6eWZyZWUtbGF6eS1leHBpcmUgbm8NCmxhenlmcmVlLWxhenktc2VydmVyLWRlbCBubw0KcmVwbGljYS1sYXp5LWZsdXNoIG5vDQphcHBlbmRvbmx5IG5vDQphcHBlbmRmaWxlbmFtZSAiYXBwZW5kb25seS5hb2YiDQphcHBlbmRmc3luYyBldmVyeXNlYw0Kbm8tYXBwZW5kZnN5bmMtb24tcmV3cml0ZSBubw0KYXV0by1hb2YtcmV3cml0ZS1wZXJjZW50YWdlIDEwMA0KYXV0by1hb2YtcmV3cml0ZS1taW4tc2l6ZSA2NG1iDQphb2YtbG9hZC10cnVuY2F0ZWQgeWVzDQphb2YtdXNlLXJkYi1wcmVhbWJsZSB5ZXMNCmx1YS10aW1lLWxpbWl0IDUwMDANCnNsb3dsb2ctbG9nLXNsb3dlci10aGFuIDEwMDAwDQpzbG93bG9nLW1heC1sZW4gMTI4DQpsYXRlbmN5LW1vbml0b3ItdGhyZXNob2xkIDANCm5vdGlmeS1rZXlzcGFjZS1ldmVudHMgIiINCmhhc2gtbWF4LXppcGxpc3QtZW50cmllcyA1MTINCmhhc2gtbWF4LXppcGxpc3QtdmFsdWUgNjQNCmxpc3QtbWF4LXppcGxpc3Qtc2l6ZSAtMg0KbGlzdC1jb21wcmVzcy1kZXB0aCAwDQpzZXQtbWF4LWludHNldC1lbnRyaWVzIDUxMg0KenNldC1tYXgtemlwbGlzdC1lbnRyaWVzIDEyOA0KenNldC1tYXgtemlwbGlzdC12YWx1ZSA2NA0KaGxsLXNwYXJzZS1tYXgtYnl0ZXMgMzAwMA0Kc3RyZWFtLW5vZGUtbWF4LWJ5dGVzIDQwOTYNCnN0cmVhbS1ub2RlLW1heC1lbnRyaWVzIDEwMA0KYWN0aXZlcmVoYXNoaW5nIHllcw0KY2xpZW50LW91dHB1dC1idWZmZXItbGltaXQgbm9ybWFsIDAgMCAwDQpjbGllbnQtb3V0cHV0LWJ1ZmZlci1saW1pdCByZXBsaWNhIDI1Nm1iIDY0bWIgNjANCmNsaWVudC1vdXRwdXQtYnVmZmVyLWxpbWl0IHB1YnN1YiAzMm1iIDhtYiA2MA0KaHogMTANCmR5bmFtaWMtaHogeWVzDQphb2YtcmV3cml0ZS1pbmNyZW1lbnRhbC1mc3luYyB5ZXMNCnJkYi1zYXZlLWluY3JlbWVudGFsLWZzeW5jIHllcw0KbWF4bWVtb3J5LXBvbGljeSBhbGxrZXlzLWxmdQ0KbGZ1LWxvZy1mYWN0b3IgMTANCmxmdS1kZWNheS10aW1lIDENCm1heGNsaWVudHMgNjAwDQptYXhtZW1vcnkgNDA5Nk0NCm1hc3RlcmF1dGggIk9UZG1PV0k0WlRNNE5UWTFNMk00T1RaaC5jb20iDQpyZXF1aXJlcGFzcyAiT1RkbU9XSTRaVE00TlRZMU0yTTRPVFpoLmNvbSINCg==" } } ]数据仅为base64编码,可以轻松解码。[root@linuxea.com /opt/2019/redis]# docker config inspect -f '{{json .Spec.Data}}' redis|cut -d '"' -f2 |base64 -d bind 0.0.0.0 protected-mode yes port 6379 .... masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com" requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com"我修改了密码字段: OTdmOWI4ZTM4NTY1M2M4OTZh.com根据定义,配置中的数据不是机密的,因此不加密。docker-compose config配置注意:由于配置是在运行应用程序之前创建的,因此在此文件中将其定义为external。如下:version: '3.7' services: redis: image: marksugar/redis:5.0.0 container_name: redis restart: always network_mode: "host" privileged: true environment: - REDIS_CONF=off - REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh - MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh - MAXCLIENTS_NUM=600 - MAXMEMORY_SIZE=4096M volumes: - /etc/localtime:/etc/localtime:ro - /data/redis-data:/data/redis:Z - /data/logs:/data/logs configs: - source: redis target: /etc/redis/redis.conf configs: redis: external: true其中configs引用如下:target: 配置文件在容器中的位置configs: 全局调用和局部调用version: '3.7' services: redis: image: .... configs: - source: redis target: /etc/redis/redis.conf configs: redis: external: true config的名称为redis,在全局配置中则填写redis,在局部配置中附加配置即可docker swarm 使用然后可以使用以下命令运行该应用程序:[root@linuxea.com /opt/2019/redis]# docker stack deploy -c ./docker-compose.yaml redis Ignoring unsupported options: network_mode, privileged, restart Ignoring deprecated options: container_name: Setting the container name is not supported. Creating network redis_default Creating service redis_redis验证[root@linuxea.com /opt/2019/redis]# docker exec -it redis_redis.1.s6f35kwutld2d7oc80e4531rp cat /etc/redis/redis.conf bind 0.0.0.0 protected-mode yes port 6379 ... masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com" requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com" ...info信息[root@linuxea.com /opt/2019/redis]# docker exec -i redis_redis.1.s6f35kwutld2d7oc80e4531rp redis-cli -a OTdmOWI4ZTM4NTY1M2M4OTZh.com info|grep cpu Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. used_cpu_sys:1.445721 used_cpu_user:1.499864 used_cpu_sys_children:0.000000 used_cpu_user_children:0.000000删除命令[root@linuxea.com /opt/2019/redis]# docker stack rm redis Removing service redis_redis Removing network redis_defaultupdate当需要修改配置的内容时,创建新配置(使用docker config create)然后更新服务以删除先前配置的config,并添加对新配置是一种常见模式。服务命令--config-rm和--config-add是我们修改配置文件的密码,而后重新创建一个redis1的config文件masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com" requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com.cn"创建redis1的config[root@linuxea.com opt/2019/redis]# docker config create redis1 redis.conf a4soto5rw4if4h7ir8jfrasyv更新配置文件先删除掉redis的config,而后添加redis1,这个过程会更新redis容器[root@linuxea.com /opt/2019/redis]# docker service update --config-rm redis --config-add src=redis1,target=/etc/redis/redis.conf redis_redis redis_redis overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged 查看更新[root@linuxea.com /opt/2019/redis]# docker exec -it redis_redis.1.5qpc63nvm75w03v3ihk17hgie cat /etc/redis/redis.conf bind 0.0.0.0 protected-mode yes .... masterauth "OTdmOWI4ZTM4NTY1M2M4OTZh.com" requirepass "OTdmOWI4ZTM4NTY1M2M4OTZh.com.cn"
2019年03月02日
7,359 阅读
0 评论
0 点赞
2019-02-22
linuxea:docker-compose设置静态ip和link与depends_on的区别
在容器中设置静态ip,这似乎又是一个过时的老话题,但是在讨论群中仍然有朋友为此感到困惑。我致力于解决这些小问题和在使用中容器落地的问题。为此,我又写了这篇文章来描述容器中使用静态ip,和不使用静态ip link的技巧。在正式配置docker-compose之前,我们需要先了解link,因为在我看来在容器中使用固定ip是件没有必要的事情,使用ip只是我们脑中长久的一个使用习惯。而在docker中link已经帮我们解决了这个麻烦事,并提供了更简单的方式。那么,通常来讲,在这个问题上产生疑问的,必然是在使用两个以上的容器。那就有必要了解depends_on。在使用link的同时,我当然也会叙述另外一个常用的选项depends_on,它非常有用。并且我会做简单的比较。阅读本篇文章,你将了解,docker-compose中3版本的使用,以及link使用方式和depends_on的技巧。容器间互联尽管,我们要解决的是单机网络,也不妨先简单介绍下跨主机和不跨主机容器间互联的区别不跨主机互相访问不跨主机互联可以采用默认的bridge网络,docker0桥在物理机上,而后创建的容器,容器内有eth0,另外一侧在物理机的docker0,而docker0可以理解成一个虚拟交换机。这样同一个交换机内的容器就可以直接进行互联。除此之外,还可以使用host网络模式,共用宿主机网络,这样一来容器和宿主机使用同一个网络,不隔离网络名称空间,网卡信息,就不存在网络上的问题。最后还可以采用联盟式容器解决网络问题跨主机容器互联容器跨主机访问实际上是做了DNAT,将容器发布出去,这些规则在iptables中可以看到Chain DOCKER (3 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !br-77c0aabda308 br-77c0aabda308 0.0.0.0/0 172.18.0.2 tcp dpt:26379 0 0 ACCEPT tcp -- !br-77c0aabda308 br-77c0aabda308 0.0.0.0/0 172.18.0.2 tcp dpt:6379 0 0 ACCEPT tcp -- !br-77c0aabda308 br-77c0aabda308 0.0.0.0/0 172.18.0.3 tcp dpt:1194 0 0 ACCEPT tcp -- !br-77c0aabda308 br-77c0aabda308 0.0.0.0/0 172.18.0.3 tcp dpt:443而对于互相双方来讲,是看不到后面的容器的,访问的是通过端口转发到真正的容器端口上。如果你要跨主机访问,就不能使用容器的ip,只能使用宿主机的ip和容器映射的端口通过iptables转发访问。[root@linuxea.com ~]# telnet 172.25.50.250 6379 Trying 172.25.50.250... Connected to 172.25.50.250. Escape character is '^]'.当然,也有例外,如果是叠加的方式就不需要在物理机做端口映射,直接通过隧道访问对端ip和端口link连接我们了解到在容器网络中的分配ip是不固定的,倘若我在第一次使用的ip地址在后面使用中发生了改变,那可能不无法正常使用了!这显然并不是我们想要的。link就解决了这个问题。links似乎将会被弃用,因为它并不重要(不使用link仍然可以通过容器名称访问),我们主要来看这里的别名操作docker-compose如下:version: '3' services: redis: image: marksugar/redis:5.0.0 container_name: redis restart: always privileged: true environment: - REDIS_CONF=on - REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh - MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh - MAXCLIENTS_NUM=600 - MAXMEMORY_SIZE=4096M volumes: - /etc/localtime:/etc/localtime:ro - /data/redis-data:/data/redis:Z - /data/logs:/data/logs ports: - '6379:6379' - '26379:26379' softether: image: marksugar/softether:4.27 links: - "redis:redisdb" container_name: softether4.27 restart: always ports: - '443:443' - '1194:1194'请注意,其中 links: - "redis:redisdb"softether和redis的容器ip地址分别是172.18.0.2和172.25.8.0.3,假设此时我们并不知道ip这里在softether中链接了redis,并设置了别名,redisdb。那也就是说我们可以使用redisdb来访问redis本身。[root@linuxea.com /opt/2019/net]# docker exec -it softether4.27 sh / # apk update fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz v3.8.2-56-g4d33ed061d [http://dl-cdn.alpinelinux.org/alpine/v3.8/main] v3.8.2-53-g53558ad6fc [http://dl-cdn.alpinelinux.org/alpine/v3.8/community] OK: 9559 distinct packages available / # apk add redis (1/1) Installing redis (4.0.11-r0) Executing redis-4.0.11-r0.pre-install Executing redis-4.0.11-r0.post-install Executing busybox-1.28.4-r0.trigger OK: 68 MiB in 35 packages / # redis-cli -a OTdmOWI4ZTM4NTY1M2M4OTZh -h redisdb info Warning: Using a password with '-a' option on the command line interface may not be safe. # Server redis_version:5.0.0 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:a7a8d032c5a69a3f redis_mode:standalone os:Linux 4.18.12-1.el7.elrepo.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:6.4.0 process_id:10 run_id:c6162ba2b02d70c1defda6073f863af1ccb207a6 tcp_port:6379 uptime_in_seconds:263 uptime_in_days:0 hz:10 configured_hz:10 lru_clock:7302247这说明了什么?我们完全可以使用容器的名称来进行访问,并不需要使用ip地址来指定。因为ip会变,名称却不会变,这是因为容器的hosts/ # cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.18.0.3 d374cbffc3b0在hosts中,已经写了ip和容器id的对应关系。你完全可以使用容器名称来进行访问。tips你可以不使用别名,直接使用容器名称进行访问,你会看到redis容器的ip地址/ # ping redis PING redis (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.093 ms 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.143 ms 64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.106 ms 64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.152 ms因为在同一个网络内。depends_on我们在看另外一个场景,假如此刻softether依赖于redis,在启动的时候就需要读取redis或者写入,通常情况下,redis必然要先启动,redis启动,softether在启动。这才是正确的方式,如果softether先启动,而redis还没有就绪,程序必然会报错,甚至崩溃。此时depends_on就有了用武之地如上场景中那般,配置如下:redis: image: marksugar/redis:5.0.0 ... softether: image: marksugar/softether:4.27 ... depends_on: - redis这样,softether会在redis启动之后启动。如果你有多个依赖,就可以按照顺序往后写,比如mysqlredis: image: marksugar/redis:5.0.0 ... mysql: image: ... softether: image: marksugar/softether:4.27 ... depends_on: - redis - mysql这样的顺序就是,softether会等待,先启动redis,在启动mysql,依次启动才到softether。由此可见,depends_on和links完全是两个不同的东西。tips:我非常有必要提醒,启动和准备就绪是两个概念 ,启动并不意味着一定就启动完成,就像点击开机并不意味着马上就进入桌面。其中的就绪状态则是另外的问题。请参阅启动顺序策略。docker-compose 静态ip默认情况下,docker会为容器分配随机(某种......)IP地址。通过使用链接,您可以将条目添加到容器的hosts文件中,并使用其IP地址映射另一个容器的名称。这样您就不需要知道其IP地址,只需使用其名称即可通过网络访问它。这种通过容器的hosts文件继而使用容器名称进行访问,这似乎已经解决了一大半人的问题。但是,我们仍然可以使用静态ip。上面我提到,网络是会发生改变的,为了彻底解决这一点,我们将网关,子网都设置好。在上面的默认网络中使用的ip是172.18.0.0网段。现在,我们修改它version: '3.7' services: redis: networks: linuxea: ipv4_address: 172.2.0.10 ... softether: networks: linuxea: ipv4_address: 172.2.0.11 ... networks: linuxea: ipam: driver: default config: - subnet: 172.2.0.0/24docker-compose如下[root@linuxea.com /opt/2019/net]# cat docker-compose.yaml version: '3.7' services: redis: image: marksugar/redis:5.0.0 container_name: redis restart: always privileged: true environment: - REDIS_CONF=on - REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh - MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh - MAXCLIENTS_NUM=600 - MAXMEMORY_SIZE=4096M volumes: - /etc/localtime:/etc/localtime:ro - /data/redis-data:/data/redis:Z - /data/logs:/data/logs ports: - '6379:6379' - '26379:26379' networks: linuxea: ipv4_address: 172.2.0.10 softether: image: marksugar/softether:4.27 links: - "redis:redisdb" container_name: softether4.27 restart: always ports: - '443:443' - '1194:1194' networks: linuxea: ipv4_address: 172.2.0.11 networks: linuxea: ipam: driver: default config: - subnet: 172.2.0.0/24现在,你就可以使用静态的ip进行访问[root@linuxea.com /opt/2019/net]# docker-compose -f ./docker-compose.yaml up -d Creating redis ... done Creating softether4.27 ... done[root@linuxea.com /opt/2019/net]# docker exec -it softether4.27 sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 293: eth0@if294: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:02:00:0b brd ff:ff:ff:ff:ff:ff inet 172.2.0.11/24 brd 172.2.0.255 scope global eth0 valid_lft forever preferred_lft forever安装redis-client/ # apk update fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz v3.8.2-56-g4d33ed061d [http://dl-cdn.alpinelinux.org/alpine/v3.8/main] v3.8.2-53-g53558ad6fc [http://dl-cdn.alpinelinux.org/alpine/v3.8/community] OK: 9559 distinct packages available / # apk add redis (1/1) Installing redis (4.0.11-r0) Executing redis-4.0.11-r0.pre-install Executing redis-4.0.11-r0.post-install Executing busybox-1.28.4-r0.trigger OK: 68 MiB in 35 packages通过静态ip链接/ # redis-cli -a OTdmOWI4ZTM4NTY1M2M4OTZh -h 172.2.0.10 Warning: Using a password with '-a' option on the command line interface may not be safe. 172.2.0.10:6379> info # Server redis_version:5.0.0 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:a7a8d032c5a69a3f redis_mode:standalone os:Linux 4.18.12-1.el7.elrepo.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:6.4.0 process_id:10 run_id:cbf1e8eacc74da75c3dfcf797d104a8a2f95076e使用ipam可以为新网络定义特定的CIDR块,然后将每个容器连接到该网络,可以在该范围上指定其IP地址。现在,redis始终使用IP地址172.2.0.10运行,softether运行172.2.0.11,并且我能够在配置文件中对这些地址进行硬编码。延伸阅读linuxea:白话容器之虚拟化网络与容器网络(8)linuxea:白话容器之docker网络(9)学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年02月22日
10,825 阅读
0 评论
1 点赞
2019-02-12
linuxea:如何复现查看docker run参数命令
如果有这样以一个场景。我使用docker run启动了了一个redis容器,而docker run的参数有很多,由于时间太久,我已经忘记了当初的启动参数,也并没有使用docker-compose这样的编排工具。现在我如何进行重启,如何找回此前的启动命令?示例使用docker run启动一个容器, docker run \ --detach \ --env REDIS_CONF=on \ --env REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env MAXCLIENTS_NUM=30 \ --net=host \ --env MAXMEMORY_SIZE=1024M \ --publish 6379:6379 \ --volume linuxea_volume \ --name linuxea_redis \ --tty --interactive \ marksugar/redis:5.0.0docker COMMAND完整命令查看首先,我们查看启动的脚本参数和完整的命令使用 docker ps -a --no-trunc docker ps -a --no-trunc可以打印docker ps -a的隐藏部分,但是这并不能看到我们run的参数[root@LinuxEA-172_25_50_250 ~]# docker ps -a --no-trunc CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c32bc1bba3a0f8d59e3bd96648838399287ee183ddbff1ca1293ccbc933c8ede marksugar/redis:5.0.0 "/Initialization.sh" 8 minutes ago Up 8 minutes linuxea_redis 1d848a10149325e6fb46ef5fa0624812ab12f28263535720d79aa564a5551e45 marksugar/nginx_createrepo:v0.2 "entrypoint.sh" 13 days ago Up 13 days nginx_repo## docker inspect此时,我们试图找回上述的docker run命令,使用docker inspect ,但是docker inspect打印的是json文件,我们需要挑选字段查看[root@LinuxEA-172_25_50_250 ~]# docker inspect -f "{{.Name}} {{.Path}} {{.Args}} {{.Config.Cmd}} {{.Config.Env}} {{.Config.Volumes}} {{.Config.Entrypoint}} {{.NetworkSettings.Networks}}" $(docker ps -a -q) /linuxea_redis /Initialization.sh [] [] [REDIS_CONF=on REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh MAXCLIENTS_NUM=30 MAXMEMORY_SIZE=1024M PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin RS_VSON=5.0.0 RS_USER=redis RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz BATADIR=/usr/local/redis DATADIR=/data/redis DATALOG=/data/logs DATACIG=/etc/redis] map[linuxea_volume:{}] [/Initialization.sh] map[host:0xc420182000] /nginx_repo entrypoint.sh [] [] [USERNAME=marksugar FTPPASSWD=123 FTPDATA=/data/wwwroot SERVER_NAME=meftp.ds.com NGINX_PORT=80 WELCOME="welome to linuxea.com" PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin version=1.14.2 USER=www INSTALL_PATH=/usr/local WWWPATH=/data/wwwroot] map[/tmp/header.html:{} /data:{} /etc/localtime:{} /etc/nginx/nginx.conf:{} /etc/nginx/vhost:{} /tmp/footer.html:{}] [entrypoint.sh] map[host:0xc42044c000]这样的显示并不直观。好在我发现了rekcod和runlike这两个逆转docker run命令,参见本章介绍和使用。runlike更漂亮些rekcod借助rekcod打印出更易读的格式,docker inspect→docker rundocker run从现有容器(via docker inspect)反向设计命令。rekcod可以将以下任何内容转换为docker run命令:容器ID /名称(rekcod将调用docker inspect)包含docker inspect输出的文件的路径原始JSON(docker inspect直接传递输出)每个docker run命令都可用于复制容器。这不是非常强大,但它应该涵盖所需的大多数参数。请参阅下面支持的字段传递容器ID /名称时,此模块docker inspect直接调用,运行它的用户也应该能够。开始安装install rekcodyum install npm -y npm i -g rekcod如果您只安装了Docker:$ docker pull nexdrew/rekcod $ alias rekcod="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod"或者你可以简单地运行它,不需要安装:$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod <container>开始使用以使用linuxea_redis容器为例,rekcod linuxea_redis,如下:[root@LinuxEA-172_25_50_250 ~]# docker ps -qa|rekcod或者这样[root@LinuxEA-172_25_50_250 ~]# rekcod linuxea_redis docker run --name linuxea_redis --runtime runc -p 6379:6379/tcp --net host --restart no -h LinuxEA-Node172_25_50_250.cluster.com --expose 26379/tcp --expose 6379/tcp -e 'REDIS_CONF=on' -e 'REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh' -e 'MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh' -e 'MAXCLIENTS_NUM=30' -e 'MAXMEMORY_SIZE=1024M' -e 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' -e 'RS_VSON=5.0.0' -e 'RS_USER=redis' -e 'RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz' -e 'BATADIR=/usr/local/redis' -e 'DATADIR=/data/redis' -e 'DATALOG=/data/logs' -e 'DATACIG=/etc/redis' -d -t -i --entrypoint "/Initialization.sh" marksugar/redis:5.0.0 我将结果换行查看,并且进行启动[这里不得不说的是,在runlike中,可以使用-q自动换行.见下文]docker run --name linuxea_redis \ -p 6379:6379/tcp \ --net host \ --restart no \ -h LinuxEA-Node172_25_50_250.cluster.com \ --expose 26379/tcp \ --expose 6379/tcp \ -e 'REDIS_CONF=on' \ -e 'REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh' \ -e 'MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh' \ -e 'MAXCLIENTS_NUM=30' \ -e 'MAXMEMORY_SIZE=1024M' \ -e 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' \ -e 'RS_VSON=5.0.0' \ -e 'RS_USER=redis' \ -e 'RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz' \ -e 'BATADIR=/usr/local/redis' \ -e 'DATADIR=/data/redis' \ -e 'DATALOG=/data/logs' \ -e 'DATACIG=/etc/redis' \ -d -t -i --entrypoint "/Initialization.sh" marksugar/redis:5.0.0启动成功[root@LinuxEA-172_25_50_250 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 492f6cdc159c marksugar/redis:5.0.0 "/Initialization.sh" 4 seconds ago Up 3 seconds linuxea_redis 1d848a101493 marksugar/nginx_createrepo:v0.2 "entrypoint.sh" 13 days ago Up 13 days nginx_repo[root@LinuxEA-172_25_50_250 ~]# docker logs linuxea_redis [i] Start configuration /etc/redis [ok] /etc/redis/redis.conf config ready [ok] Start variable substitution REDIS_CONF=on [ok] Replace the maxclients=30 variable value [ok] Replace the maxmemory=1024M variable value [ok] Replace the requirepass=OTdmOWI4ZTM4NTY1M2M4OTZh variable value [ok] Replace the masterauth=OTdmOWI4ZTM4NTY1M2M4OTZh variable value [i] Start up /usr/local/bin/redis-server /etc/redis/redis.conf runlike我仍然要提一下runlike,和rekcod有一样的作用本地安装使用yum install python-pippip install runlike用法:runlike <container-name>这打印出你需要运行什么来获得类似的容器。你可以$(runlike container-name)一步完成其输出。如下:[root@LinuxEA-172_25_50_250 ~]# runlike linuxea_redis docker run --name=linuxea_redis --hostname=LinuxEA-Node172_25_50_250.cluster.com --env=REDIS_CONF=on --env=REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh --env=MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh --env=MAXCLIENTS_NUM=30 --env=MAXMEMORY_SIZE=1024M --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env=RS_VSON=5.0.0 --env=RS_USER=redis --env=RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz --env=BATADIR=/usr/local/redis --env=DATADIR=/data/redis --env=DATALOG=/data/logs --env=DATACIG=/etc/redis --volume=linuxea_volume --network=host -p 6379:6379 --restart=no --detach=true -t marksugar/redis:5.0.0-p将命令行分解为漂亮漂亮的行。例如:[root@LinuxEA-172_25_50_250 ~]# runlike -p linuxea_redis docker run \ --name=linuxea_redis \ --hostname=LinuxEA-Node172_25_50_250.cluster.com \ --env=REDIS_CONF=on \ --env=REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env=MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env=MAXCLIENTS_NUM=30 \ --env=MAXMEMORY_SIZE=1024M \ --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ --env=RS_VSON=5.0.0 \ --env=RS_USER=redis \ --env=RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz \ --env=BATADIR=/usr/local/redis \ --env=DATADIR=/data/redis \ --env=DATALOG=/data/logs \ --env=DATACIG=/etc/redis \ --volume=linuxea_volume \ --network=host \ -p 6379:6379 \ --restart=no \ --detach=true \ -t \ marksugar/redis:5.0.0docker使用runlike被封装为一个名为assaflavie / runlike的Docker镜像。docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER或者您可以使用别名运行它,例如,将其保存在~/.profile或中~/.bashrcalias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike"然后您可以直接以本地命令运行runlike YOUR-CONTAINERdocker-compose事实上这样的方式,我并不推荐,你大可不必这样 麻烦,直接使用docker-compose就可以完成简单的编排,如下:version: '2' services: redis: image: marksugar/redis:5.0.0 container_name: redis restart: always network_mode: "host" privileged: true environment: - REDIS_CONF=on - REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh - MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh - MAXCLIENTS_NUM=600 - MAXMEMORY_SIZE=4096M volumes: - /etc/localtime:/etc/localtime:ro # - /etc/redis:/etc/redis - /data/redis-data:/data/redis:Z - /data/logs:/data/logs学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年02月12日
23,044 阅读
0 评论
0 点赞
2019-02-11
linuxea:如何设置docker日志轮换
倘若你在使用docker,那么你肯定遇到过这种情况。日志太大占用了磁盘空间有太多了历史日志,查看并不便利在许多情况下,读取日志在调试时占用了大部分时间。本文介绍如何为Docker容器设置日志轮换。默认日志记录驱动程序我们可以为容器配置不同的日志驱动程序 默认情况下,容器的stdout和stderr写在位于/var/lib/docker/containers/[container-id]/[container-id]-json.log中的JSON文件中。如果将其置于无人看管状态,则会占用大量磁盘空间,如下所示。手动清除日志如果此JSON日志文件占用了大量磁盘,我们可以使用以下命令清除它。truncate -s 0 < logfile >我们可以设置一个cronjob来定期清除这些JSON日志文件。但从长远来看,设置日志轮换会更好。设置日志轮换配置默认日志记录驱动程序这可以通过在/etc/docker/daemon.json中添加以下值来完成。如果该文件不存在,请创建该文件。[root@linuxea ~]# cat /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "10" } }该JSON文件有几个选项,我们甚至可以更改为其他日志驱动器,如系统日志。有关更多信息,请参阅Docker文档 - 配置日志记录驱动程序。执行命令以重新加载更新的daemon.json。重新启动后,新配置将应用于所有新创建的容器。配置容器的日志记录驱动程序如果你不想在全局范围内应用配置,也可以在容器级别上完成配置。docker run命令我们可以在docker run命令中指定日志记录驱动程序和选项。例如:$ docker run \ --log-driver json-file \ --log-opt max-size=10m \ --log-opt max-file=10 \ alpine echo hello world使用docker-compose还可以使用docker-compose配置日志记录驱动程序和选项。例如:version: '3.2' services: nginx: image: 'marksugar/redis:5.0' ports: - '3306:3306' logging: driver: "json-file" options: max-size: "1k" max-file: "3"这样一来,就会变成有3个1k的日志文件,多余的会被切割删除掉。你还可以使用单个文件,通过调整max-size大小决定。docker目录转移如果你的容器非常的多,那么日志量也就会增加,随之而来的问题可能是根目录不够用。我们可以改善这一点1,首先关闭docker2,移动docker目录到target location3,而后做软连接如下所示:service docker stop // 关闭docker mv /var/lib/docker /root/data/docker //将docker目录移动到/root/data/docker ln -s /root/data/docker /var/lib/docke //链接到/var/lib/docker学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器
2019年02月11日
3,710 阅读
0 评论
0 点赞
2019-02-09
linuxea:如何使用docker-compose优雅的运行多个容器
前言:docker公司在2015年收购fig项目,而在早期fig项目是非常热度的,这比kubermetes要早,fig之所以收到欢迎就是因为,fig提出了容器编排,并且在一定范围解决了"容器编排"fig被收购后改名为compose,随即成为docker公司最受欢迎的第二大受欢迎的项目,直到今天仍然被很多人使用。docker-compose.yml通过使用up和down命令启动和停止容器,并且可以使用docker-compose定义应用程序细节,并且可以控制多容器应用程序。Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,你可以使用Compose文件来配置应用程序的服务。然后,使用单个命令,你可以从配置中创建并启动所有服务。- docker在Github上地址与docker命令的相似之处docker-compose CLI命令是类似于于docker的命令,除了一些与多个容器和image的指令相关的附加内容。特别是,如果你将它们与docker一起使用的时候,以下命令是需要熟悉的:ps,build,pull,push,run,logs在我发布的十大Docker命令中了解更多关于这些的信息。docker-compose up and downdocker-compose up创建和启动容器。在“ 分离(后台) ”模式(-d)中,Compose在启动容器后退出,但容器继续在后台运行。docker-compose up -d linuxea_nginxdocker-compose down - 停止并删除容器,网络,image和卷,例如docker-compose down -v。这有一些有用的选择:--rmi type 删除images。 类型必须是以下之一:'all':删除任何服务使用的所有images。 'local':仅删除没有`image`字段设置的自定义标记的images。-v, --volumes 删除在Compose文件的volumes部分中声明的命名卷和附加到容器的匿名卷,匿名卷发生在dockerfile中,我们可以在之外,覆盖匿名卷。--remove-orphans 删除未在Compose文件中定义的服务的容器创建一个Dockerfile就像运行docker一样,你需要一个Dockerfile来指定如何为程序创建镜像和容器。Ruby on Rails应用程序的Dockerfile示例可以是:FROM ruby:2.3.3 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install volumes /datalinuxea COPY . /myapp该docker-compose:入门指南让你一步一步的指示,创建Dockerfile并将其集成到你的docker-compose.yml。如上: volumes /datalinuxea就是匿名卷docker-compose.yml:的结构和组件要定义多容器应用程序,请在项目的根目录中使用docker-compose.yml文件。该docker-compose文档提供详细的解释和指导,了解此文档更好的掌握。以下是一些主要功能的快速入门指南:在顶部包括版本: version: "3"在docker-compose版本中,是有一定的差异,这需要使用者查探问题,如早期的v3弃用volumes_from然后 services:在此之后,列出要创建的容器,例如每个容器都有配置选项。image - 这可能是存储在docker hub中的image,也可能是存储在本地的imageimage: ruby:alpinedepends_on - 此容器需要的其他容器,创建父容器也将创建和启动依赖容器。倘若此刻,运行一个LNMP,那么我们首先应该让mariadb 先启动,而后是php,再nginx,depends_on则对这些启动的依赖顺序起到关键的作用。如下所示中,web是以来db和redis,只有db和redis 成功up起来后才会启动webversion: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgresenvironment - 添加环境变量。environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRETvolumes - 包括主机路径或命名卷。你可以使用此格式替换容器中的数据,<path to file>:<path to location in container>并且可以使用权限(例如 :ro,只读)来执行此操作。version: "3.2" services: web: image: nginx:alpine volumes: - type: volume source: mydata target: /data volume: nocopy: true - type: bind source: ./static target: /opt/app/static db: image: postgres:latest volumes: - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock" - "dbdata:/var/lib/postgresql/data"ports - 指定ports(HOST:CONTAINER)或仅指定容器端口(选择短暂的主机端口)。ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp" 有关端口的更多信息,请查看linuxea:简单解释docker的端口和端口暴露(EXPOSE)。了解更多Docker Compose是运行多容器应用程序的强大工具。有许多方法可以配置你的应用程序docker-compose.yml以及其他Docker Compose CLI命令来学习。查看Docker文档和我的其他帖子了解更多信息。docker-compose:入门docker-compose CLI文档Docker-compose docs:文档阅读更多docker文章十大Docker命令,你必须了解如何过滤和grep Docker容器,image和卷以及如何使用它们使用单个命令清理Docker镜像,容器和卷学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器dockerfile
2019年02月09日
4,324 阅读
0 评论
0 点赞
2019-02-08
linuxea:有效使用docker logs查看日志
在开发基于Docker的应用程序时,能够在日志中查找特定信息并将此数据保存到文件中可以加快故障排除和调试过程。以下是使用日志选项,tail和grep在docker容器的日志数据中查找所需内容的一些提示。关于开始使用Docker的帖子新手docker cli指令和docker run十个选项和其他docker帖子显示所有日志在启动Docker容器(例如with)时docker-compose up,它将自动显示日志。如果你在后台运行它们,例如使用docker-compose up -d或从不同的终端运行它们,则可以使用以下方式显示日志:docker logs [OPTIONS] CONTAINERdocker-compose logs (所有容器)但是,这将为你提供大量信息。跟踪容器日志使用docker-compose,你可以指定要使用的容器日志(在位于docker-compose文件的当前目录执行):docker-compose logs [options] [SERVICE...]调试特定应用程序时,一个有用的选项是持续实时查看日志输出。这意味着你可以启动容器,测试功能并查看在使用时发送到日志的内容。--follow , -f另一种方法是测试你的应用程序,然后在日志中搜索特定信息,以向你显示它的工作情况(或不是!!!)。有两个基于Unix命令的命令可用于此目的。使用tail和grep切片和搜索日志该tail命令输出n文件末尾的最后一行数。例如:[root@LinuxEA-172_25_50_250 /data/mirrors]# tail -n5 docker-compose.yaml - FTPPASSWD=123 - FTPDATA=/data/wwwroot - SERVER_NAME=meftp.ds.com - NGINX_PORT=80 - WELCOME="welome to www.linuxea.com"要查看docker日志中的最新输出,你可以直接在日志文件中使用它,也可以使用docker --tail选项。--tail 从日志末尾显示的行数[root@LinuxEA-172_25_50_250 /data/mirrors]# docker-compose logs --tail 5 nginx_repo Attaching to nginx_repo nginx_repo | 2019-01-29 17:45:58,689 INFO spawned: 'vsftpd' with pid 26 nginx_repo | 2019-01-29 17:45:58,738 INFO exited: vsftpd (exit status 0; not expected) nginx_repo | 2019-01-29 17:45:59,739 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO success: createrepo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO gave up: vsftpd entered FATAL state, too many start retries too quickly这仅仅只是一个示例,其他选项如,-f, -t ,--tail docker官网也有说明另外,可以与日志一起使用的另一个Bash命令是grep返回包含指定字符串的行。例如:docker-compose logs | grep success这将显示docker容器记录的所有想要的信息。非常有用,可以看到你需要关注开发的重点。[root@LinuxEA-172_25_50_250 /data/mirrors]# docker-compose logs --tail 5 nginx_repo|grep success nginx_repo | 2019-01-29 17:45:59,739 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO success: createrepo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)按时间记录如果你知道要关注的时间段,例如你知道存在问题的时间,则可以告诉docker使用时间戳显示时间戳--timestamps , -t[root@LinuxEA-172_25_50_250 /data/mirrors]# docker-compose logs -t nginx_repo Attaching to nginx_repo nginx_repo | 2019-01-29T09:45:57.110408403Z useradd: warning: the home directory already exists. nginx_repo | 2019-01-29T09:45:57.110441950Z Not copying any file from skel directory into it. nginx_repo | 2019-01-29T09:45:57.136689405Z Changing password for user marksugar. nginx_repo | 2019-01-29T09:45:57.136748778Z passwd: all authentication tokens updated successfully. nginx_repo | 2019-01-29T09:45:57.593741281Z Saving Primary metadata nginx_repo | 2019-01-29T09:45:57.593832853Z Saving file lists metadata nginx_repo | 2019-01-29T09:45:57.593854286Z Saving other metadata nginx_repo | 2019-01-29T09:45:57.593862151Z Generating sqlite DBs nginx_repo | 2019-01-29T09:45:57.593869092Z Sqlite DBs complete nginx_repo | 2019-01-29T09:45:57.672214250Z 2019-01-29 17:45:57,671 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message. nginx_repo | 2019-01-29T09:45:57.679619865Z 2019-01-29 17:45:57,679 INFO RPC interface 'supervisor' initialized nginx_repo | 2019-01-29T09:45:57.679661466Z 2019-01-29 17:45:57,679 CRIT Server 'unix_http_server' running without any HTTP authentication checking nginx_repo | 2019-01-29T09:45:57.679740900Z 2019-01-29 17:45:57,679 INFO supervisord started with pid 1 nginx_repo | 2019-01-29T09:45:58.683866045Z 2019-01-29 17:45:58,683 INFO spawned: 'nginx' with pid 24 nginx_repo | 2019-01-29T09:45:58.687228502Z 2019-01-29 17:45:58,686 INFO spawned: 'createrepo' with pid 25 nginx_repo | 2019-01-29T09:45:58.690025433Z 2019-01-29 17:45:58,689 INFO spawned: 'vsftpd' with pid 26 nginx_repo | 2019-01-29T09:45:58.738620050Z 2019-01-29 17:45:58,738 INFO exited: vsftpd (exit status 0; not expected) nginx_repo | 2019-01-29T09:45:59.740406128Z 2019-01-29 17:45:59,739 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29T09:45:59.740444435Z 2019-01-29 17:45:59,740 INFO success: createrepo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29T09:45:59.740540049Z 2019-01-29 17:45:59,740 INFO gave up: vsftpd entered FATAL state, too many start retries too quickly选择一个特定的时间段--since和--until选项(仅适用于docker logs,不是docker-compose logs):--since从时间戳(例如2013-01-02T13:23:37)或相对(例如42分钟42米)显示日志--until在时间戳(例如2013-01-02T13:23:37)或相对之前显示日志(例如42分钟42米)例如,如果我想在前面的示例中看到日志接近info的消息,我将执行:[root@LinuxEA-172_25_50_250 /data/mirrors]# docker logs -t --since 2019-01-29T09:45:57.679661466Z --until 2019-01-29T09:45:59.740540049Z nginx_repo 2019-01-29T09:45:57.679661466Z 2019-01-29 17:45:57,679 CRIT Server 'unix_http_server' running without any HTTP authentication checking 2019-01-29T09:45:57.679740900Z 2019-01-29 17:45:57,679 INFO supervisord started with pid 1 2019-01-29T09:45:58.683866045Z 2019-01-29 17:45:58,683 INFO spawned: 'nginx' with pid 24 2019-01-29T09:45:58.687228502Z 2019-01-29 17:45:58,686 INFO spawned: 'createrepo' with pid 25 2019-01-29T09:45:58.690025433Z 2019-01-29 17:45:58,689 INFO spawned: 'vsftpd' with pid 26 2019-01-29T09:45:58.738620050Z 2019-01-29 17:45:58,738 INFO exited: vsftpd (exit status 0; not expected) 2019-01-29T09:45:59.740406128Z 2019-01-29 17:45:59,739 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 2019-01-29T09:45:59.740444435Z 2019-01-29 17:45:59,740 INFO success: createrepo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 2019-01-29T09:45:59.740540049Z 2019-01-29 17:45:59,740 INFO gave up: vsftpd entered FATAL state, too many start retries too quickly组合命令你可以将这些选项和命令组合在一起,以使用你需要的信息来定位日志的特定区域。在下面的示例中,我们将-t timestamps选项与--tail容器日志的最后5行组合nginx_repo,然后在这些行中搜索包含INFO仅查看INFO级别记录的行的行。[root@LinuxEA-172_25_50_250 /data/mirrors]# docker-compose logs --tail 5 nginx_repo|grep INFO nginx_repo | 2019-01-29 17:45:58,689 INFO spawned: 'vsftpd' with pid 26 nginx_repo | 2019-01-29 17:45:58,738 INFO exited: vsftpd (exit status 0; not expected) nginx_repo | 2019-01-29 17:45:59,739 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO success: createrepo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO gave up: vsftpd entered FATAL state, too many start retries too quickly如果要在所有内容中查找,这里可以替换成all[root@LinuxEA-172_25_50_250 /data/mirrors]# docker-compose logs --tail all nginx_repo|grep INFO nginx_repo | 2019-01-29 17:45:57,679 INFO RPC interface 'supervisor' initialized nginx_repo | 2019-01-29 17:45:57,679 INFO supervisord started with pid 1 nginx_repo | 2019-01-29 17:45:58,683 INFO spawned: 'nginx' with pid 24 nginx_repo | 2019-01-29 17:45:58,686 INFO spawned: 'createrepo' with pid 25 nginx_repo | 2019-01-29 17:45:58,689 INFO spawned: 'vsftpd' with pid 26 nginx_repo | 2019-01-29 17:45:58,738 INFO exited: vsftpd (exit status 0; not expected) nginx_repo | 2019-01-29 17:45:59,739 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO success: createrepo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO gave up: vsftpd entered FATAL state, too many start retries too quickly将日志写入文件现在你已掌握了docker logs命令以及如何准确找到所需内容,请使用此命令将数据发送到日志文件。使用Bash或替代shell(如Zsh),>>命令后跟文件名输出并将数据保存到该文件。docker-compose logs --tail all nginx_repo|grep INFO >> ./nginx_repo.log你可能希望使用它来为特定日志数据创建日志文件。例如,在调试时,你可以创建警告或错误。docker-compose logs --tail all nginx_repo| grep warning >> logs_warnings.log现在我的nginx_repo.log文件内容包含:nginx_repo | 2019-01-29 17:45:57,679 INFO RPC interface 'supervisor' initialized nginx_repo | 2019-01-29 17:45:57,679 INFO supervisord started with pid 1 nginx_repo | 2019-01-29 17:45:58,683 INFO spawned: 'nginx' with pid 24 nginx_repo | 2019-01-29 17:45:58,686 INFO spawned: 'createrepo' with pid 25 nginx_repo | 2019-01-29 17:45:58,689 INFO spawned: 'vsftpd' with pid 26 nginx_repo | 2019-01-29 17:45:58,738 INFO exited: vsftpd (exit status 0; not expected) nginx_repo | 2019-01-29 17:45:59,739 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO success: createrepo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) nginx_repo | 2019-01-29 17:45:59,740 INFO gave up: vsftpd entered FATAL state, too many start retries too quickly这意味着你可以使用与文本文件一起使用的所有其他应用程序和命令,并将它们应用于此日志数据。为什么不尝试一些自己的自定义日志命令并将输出保存到自己的日志文件中?了解更多使用有针对性的日志数据可以更轻松地开发和调试docker应用程序。例如,你可以在一段时间内搜索特定类型的错误,然后可以将其保存到错误日志文件中。你或许还需要了解:如何从命令行删除docker容器docker命令如何过滤docker容器使用单个命令清理docker镜像,容器和卷学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用Bash命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器
2019年02月08日
4,594 阅读
0 评论
0 点赞
1
2