Docker 问题汇总

Docker 问题汇总

1. 进入容器后无法使用 service 命令:

[root@3f3838ae0cda /]# service
bash: service: command not found

一般原因是没有将/sbin/service 加到 path 中,但在 docker 的官方 centos 容器中,到/sbin 目录下也没有找到 service 命令.
解决

yum install initscripts.x86_64

2. 为什么从宿主机无法访问 container 中的 web 服务

docker run -ti -p 8080:8080 1772e664a139 /bin/bash

docker container 的 ip

[root@deb47ba802c7 bin]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:2  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 84  bytes 8558 (8.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 50  bytes 73867 (72.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

问题
在容器内访问8080可以, 但是在宿主机上访问: http://172.17.0.2:8080 和 http://localhost:8080 均无法访问.

解决
mac下使用boot2docker的情况下:

➜  ~  docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

应该通过这个 IP 访问:

➜  ~  curl -I http://192.168.99.100:8080
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Fri, 25 Dec 2015 17:31:21 GMT

3. 解压失败

问题

➜  temp  tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz
tar: Unrecognized archive format
tar: Error exit delayed from previous errors.

解决
出现这种问题的原因,一般是因为后缀名与文件实际类型不一致. 使用file查看文件属性

➜  temp  file Mycat-server-1.4-release-20151019230038-linux.tar.gz
Mycat-server-1.4-release-20151019230038-linux.tar.gz: HTML document text

可以看到这个文件实际上是一个 html 文档,直接解压肯定不成功

4. mysql的启动问题

mysql 安装成功后, 需要进行初始化:

mysql_install_db

在启动 mysqld 的时候会报类似下面的报错

2015-09-25 03:46:43 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-09-25 03:46:43 0 [Note] mysqld (mysqld 5.6.26) starting as process 775 ...
2015-09-25 03:46:43 775 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
2015-09-25 03:46:43 775 [ERROR] Aborting
2015-09-25 03:46:43 775 [Note] Binlog end
2015-09-25 03:46:43 775 [Note] mysqld: Shutdown complete

解决
原因是因为使用了 root 用户来启动 mysqld, 出于安全的考虑,这在 mysql 中是不允许的.这是使用 mysql 用户启动, 即mysqld --user=mysql 仍然会报错, 原因是因为前面mysql_install_db 是使用 root 来执行的,就会导致/var/lib/mysql 下的文件所属为 root 用户, 再使用 mysql 用户启动时就没有权限了.
解决方法:

#修改/var/lib/mysql 的所属
chown -R mysql:mysql /var/lib/mysql
#再使用 mysql 用户进行数据库初始化
mysql_install_db --user=mysql

在 docker 中使用service mysqld start 会报错:

[root@deb47ba802c7 init.d]# service mysqld start
Redirecting to /bin/systemctl start  mysqld.service
Failed to get D-Bus connection: Operation not permitted

可能是由于 docker 使用的是精简版的 linux 版本, 很多东西缺失导致的. 所以,正确的启动和停止方式应该是:

#启动
mysqld --user=mysql
#停止
mysqladmin shutdown
2015-12-12 20:38320