首页
学
【学】PHP
【学】前端
【学】Linux
【学】杂学
【学】支付
【学】Docker
享
【享】文件
【享】工具
日记
Me
【Me】我
【Me】留言
老郭博客-程序员客栈
文章模型
下载模型
首页
学
【学】PHP
【学】前端
【学】Linux
【学】杂学
【学】支付
【学】Docker
享
【享】文件
【享】工具
日记
Me
【Me】我
【Me】留言
首页
学
【学】Docker
docker笔记(常用命令及操作技巧)
docker笔记(常用命令及操作技巧)
发布时间:
3年前
作者:
老郭
热度:
906 ℃
评论数:
# 常用命令 ```php docker start 容器名(容器ID也可以) docker stop 容器名(容器ID也可以) docker run 命令加 -d 参数,docker 会将容器放到后台运行 docker ps 正在运行的容器 docker ps -a 所有容器 docker logs –tail 10 -tf 容器名 查看容器的日志文件,加-t是加上时间戳,f是跟踪某个容器的最新日志而不必读整个日志文件 docker top 容器名 查看容器内部运行的进程 docker exec -d 容器名 touch /etc/new_config_file 通过后台命令创建一个空文件 docker run –restart=always –name 容器名 -d ubuntu /bin/sh -c “while true;do echo hello world; sleep 1; done” 无论退出代码是什么,docker都会自动重启容器,可以设置 –restart=on-failure:5 自动重启的次数 docker inspect 容器名 对容器进行详细的检查,可以加 –format=’{(.State.Running)}’ 来获取指定的信息 docker rm 容器ID 删除容器,注,运行中的容器无法删除 docker rm docker ps -a -q 这样可以删除所有的容器 docker images 列出镜像 docker pull 镜像名:标签 拉镜像 docker search 查找docker Hub 上公共的可用镜像 docker build -t=’AT/web_server:v1’ 命令后面可以直接加上github仓库的要目录下存在的Dockerfile文件。 命令是编写Dockerfile 之后使用的。-t选项为新镜像设置了仓库和名称:标签 docker login 登陆到Docker Hub,个人认证信息将会保存到$HOME/.dockercfg, docker commit -m=”comment “ –author=”AT” 容器ID 镜像的用户名/仓库名:标签 不推荐这种方法,推荐dockerfile docker history 镜像ID 深入探求镜像是如何构建出来的 docker port 镜像ID 端口 查看映射情况的容器的ID和容器的端口号,假设查询80端口对应的映射的端口 run 运行一个容器, -p 8080:80 将容器内的80端口映射到docker宿主机的某一特定端口,将容器的80端口绑定到宿主机的8080端口,另 127.0.0.1:80:80 是将容器的80端口绑定到宿主机这个IP的80端口上,-P 是将容器内的80端口对本地的宿主机公开 http://docs.docker.com/reference/builder/ 查看更多的命令 docker push 镜像名 将镜像推送到 Docker Hub docker rmi 镜像名 删除镜像 docker attach 容器ID 进入容器 docker cp index.html 17add7bbc58c://usr/share/nginx/html 将本机的 index.html 拷贝到 docker 中 容器ID 为 17add7bbc58c 的 /usr/share/nginx/html 目录下。 docker stop 17add7bbc58c 停止ID为 17add7bbc58c 的容器 docker commit -m 'fun' e7c34d924c31 nginx-fun 保存docker 容器 ``` ### 删除所有容器和镜像的命令 ```php docker rm `docker ps -a |awk '{print $1}' | grep [0-9a-z]` 删除停止的容器 docker rmi $(docker images | awk '/^<none>/ { print $3 }') ``` ### 进入容器的命令 ``` # docker inspect --format "{{ .State.Pid }}" 54a454b827e5(容器ID) 20426 # nsenter --target 20426 --mount --uts --ipc --net --pid ``` --- ### dockerfile 语法 ``` MAINTAINER 标识镜像的作者和联系方式 EXPOSE 可以指定多个EXPOSE向外部公开多个端口,可以帮助多个容器链接 FROM 指令指定一个已经存在的镜像 #号代表注释 RUN 运行命令,会在shell 里使用命令包装器 /bin/sh -c 来执行。如果是在一个不支持shell 的平台上运行或者不希望在shell 中运行,也可以 使用exec 格式 的RUN指令 ENV REFRESHED_AT 环境变量 这个环境亦是用来表明镜像模板最后的更新时间 VOLUME 容器添加卷。一个卷是可以 存在于一个或多个容器内的特定的目录,对卷的修改是立刻生效的,对卷的修改不会对更新镜像产品影响,例:VOLUME[“/opt/project”,”/data”] ADD 将构建环境 下的文件 和目录复制到镜像 中。例 ADD nginx.conf /conf/nginx.conf 也可以是取url 的地址文件,如果是压缩包,ADD命令会自动解压、 USER 指定镜像用那个USER 去运行 COPY 是复制本地文件,而不会去做文件提取(解压包不会自动解压) 例:COPY conf.d/ /etc/apache2/ 将本地conf.d目录中的文件复制到/etc/apache2/目录中 ``` --- ### 问题点整理 #### docker 服务没启动 启动并设置为开机自动启动docker服务 ``` # docker info Cannot connect to the Docker daemon. Is the docker daemon running on this host? # ps aux | grep docker root 7902 0.0 0.0 112648 956 pts/0 S+ 13:54 0:00 grep --color=auto docker # service docker start Redirecting to /bin/systemctl start docker.service # systemctl start docker ``` #### 注意挂载目录的权限问题,不然容器成功启动几秒后立刻关闭 例:以下/data/run/mysql 目录没权限的情况下就会出现刚才那种情况 ``` docker run --name mysql57 -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -v /data/logs/mysql:/var/log/mysql -v /data/run/mysql:/var/run/mysqld -e MYSQL_ROOT_PASSWORD=123456 -it centos/mysql:v5.7 ``` #### 需要注意php.ini 中的目录对应 mysql 的配置的目录需要挂载才能获取文件内容,不然php连接mysql失败 ``` # php.ini mysql.default_socket = /data/run/mysql/mysqld.sock mysqli.default_socket = /data/run/mysql/mysqld.sock pdo_mysql.default_socket = /data/run/mysql/mysqld.sock # mysqld.cnf pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock ``` #### 使用php连接不上redis ``` # 错误的 $redis = new Redis; $rs = $redis->connect('127.0.0.1', 6379); ``` ``` # php连接不上,查看错误日志 PHP Fatal error: Uncaught RedisException: Redis server went away in /www/index.php:7 # 考虑到docker 之间的通信应该不可以用127.0.0.1 应该使用容器里面的ip,所以查看redis 容器的ip # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5fb4b1904f1c centos/nginx:v1.11.5 "/usr/local/nginx/sbi" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, 443/tcp nginx11 2bf7ad9f44f9 centos/php:v7.0.12 "/usr/local/php/sbin/" About an hour ago Up About an hour 0.0.0.0:9000->9000/tcp php7 4b84858ea4e4 centos/redis:v3.2.6 "/bin/sh -c '\"/usr/lo" 18 hours ago Up About an hour 0.0.0.0:6379->6379/tcp redis326 158c67aa178c centos/mysql:v5.7 "docker-entrypoint.sh" 6 days ago Up About an hour 0.0.0.0:3306->3306/tcp mysql57 # docker inspect 4b84858ea4e4 结果是为 192.168.0.4,测试连接,成功 $redis = new Redis; $rs = $redis->connect('192.168.0.4', 6379); #问题是重启容器ip为动态的,解决该问题 #第一步:创建自定义网络 #备注:这里选取了172.172.0.0网段,也可以指定其他任意空闲的网段 docker network create --subnet=172.171.0.0/16 docker-at docker run --name redis326 --net docker-at --ip 172.171.0.10 -d -p 6379:6379 -v /data:/data -it centos/redis:v3.2.6 # 连接redis 就可以配置对应的ip地址了,连接成功 $redis = new Redis; $rs = $redis->connect('172.171.0.10', 6379); ``` 以上情况虽然容器之间关联了,但是容器之间的通讯需要用搭建的网段的连接。 假设:只有mysql 的容器,我们机器挂载了3306的端口,我们本地可以127.0.0.1去连接mysql容器服务 但是假设php服务也在容器里面,这时就不可以这么连接,因为是php容器去连接mysql容器,所以需要一个连接的ip。 #### 使用docker-compose 报错 ``` // 使用pip 安装docker-compose pip install -U docker-compose ``` 假设没安装pip,会报以下错误,windows 请参数 http://www.cnblogs.com/RSsky/articles/5525999.html ``` bash: pip: command not found ``` linux 请执行 ``` yum install python-pip ```
Docker,容器,笔记,常用命令,小结
上一篇:
docker搭建LNMPR环境
下一篇:
Docker容器中安装vim
栏目导航
【学】PHP
【学】前端
【学】Linux
【学】杂学
【学】支付
【学】Docker
相关文章
docker搭建LNMPR环境
1044 ℃
docker笔记(常用命令及操作技巧)
906 ℃
Docker容器中安装vim
2729 ℃
微信小程序
手机扫码访问