Docker常用命令汇总
镜像
远程镜像
# 检索
docker search
# 拉取镜像到本地
docker pull name:tag
本地镜像
# 查看所有镜像
docker images
# 删除
docker image rm name
网络
# 创建
docker network create --subnet=192.168.3.1/24 mynetwork
# 查看网络
docker network ls
# 删除
docker network rm name / prune
容器
# 一个比较完整的运行容器的命令
docker run --name mysql \
-p 3306:3306 \
-v /data/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-itd \
--net mynetwork --ip 192.168.3.1 \
mysql:5.7
# -name:指定运行的容器名
# -v:代表文件映射,前面是宿主机目录,后面是虚拟机目录
# -p:代表端口映射,这样可以直接通过本机ip进行连接
# -itd:分别是交互式、分配一个终端、后台运行(后台运行时,可以不添加-t参数)
# 登录容器的终端
docker exec -it mysql /bin/bash
# 登录终端,exit之后会stop容器服务
docker attach mysql
# rm参数可以在退出的时候直接删除容器。
# 没有rm参数的时候,run的结果会生成一个记录(docker ps -a进行查看)
# 后续我们可以通过docker start|stop name等命令来直接进行启动
# 同时也没法再run相同名称的容器
# 添加了rm参数之后stop会清除记录,可以再次运行run相同名称的容器,相当于手动执行了docker rm name
docker run --rm ...
# 启动后可以查看正在运行的进程,-a是包括已退出的所有进程
docker ps / ps -a
# run之后可以这样进行维护
docker start|stop|restart mysql
# 可以查看错误日志
docker logs mysql
# 删除
docker rm mysql
# 查看容器ip
docker inspect name | grep IPAddress
版本控制
# 本地先提交一个镜像
docker commit oldname newname:tag
# 登录远程仓库
docker login url
# 打标签
docker tag local:tag url:name:tag
# 推送
docker push url:name:tag
Dockerfile
在一个空目录下创建Dockerfile文件,添加如下内容,依赖官方的centos镜像添加ssh服务、go环境和自启动脚本
FROM centos:centos6
RUN yum -y install openssh-server wget \
&& wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz \
&& tar -C /usr/local -xzvf go1.13.4.linux-amd64.tar.gz \
&& echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc \
&& echo -e "service sshd start\n/bin/bash" > /start.sh
CMD ["/bin/bash", "/start.sh"]
切换到Dockerfile目录,执行构建命令
docker build -t name:tag .
2019-12-06 update
运行shell命令
# 运行ls命令,并将输出显示的宿主机上
docker exec -t name bash -c "ls"
连接容器除了exec
还可以用如下命令
docker attach name/id
attach
与exec
不同的是执行了exit
也会停止容器的运行。如果不想停止运行可以使用默认的快捷键ctrl-p ctrl-q
来退出。
但是上面的快捷键使用了ctrl-p
,所以会导致docker容器内的终端ctrl-p
的行为很怪异,因为通常情况下这个快捷键是用来翻命令历史的。
解决办法是在docker的配置文件,通常是~/.docker/config.json
,添加如下内容,也就是把原来的快捷键替换为ctrl-@
:
{
"detachKeys": "ctrl-@"
}
然后重启容器即可。
docker-compose
在使用docker-compose的过程中,发现之前自己对docker的理解不是很正确,之前的理解还是停留在虚拟机的层面,比如我前一阵还想通过在官方的ubuntu镜像上安装各种软件来构建自己的一套开发环境,但是在实施的过程中隐约觉得哪里不对,后来了解到docker-compose这个工具,才发现docker原来是应该这样用的:组织一系列的容器来构建完整的开发环境。同时看docker-hub官方仓库,可以发现官方维护了很多镜像都是单一服务,例如nginx、redis等。
同时在实施的过程中也发现容器可以分为两种,一种是有值守进程的容器,例如nginx、fpm、redis、mysql等,这些容器提供服务端供客户端调用。而另一种是开发环境的容器,例如golang、java、composer,这些容器通常都是提供了解释、编译的环境,不会一直处在运行状态,只在需要的时候docker exec调用即可,类似于本地的命令。而这种容器在使用docker-compose组织的时候也会在启动之后立即退出,因为这些命令的工作已经完成了,没有值守的前台进程。
docker作为一个轻量化的容器,每个容器应该保持精简,运行单独的服务。其中最重要的一个好处是:如果用一个镜像安装所有的软件,需要升级的时候需要重装,而docker-compose方案可以轻松的进行版本切换(改镜像的版本即可)。
- 本文作者:吴泽辉
- 本文链接:https://mutex.top/posts/3239d275/
- 发表日期:2019年11月5日
- 版权声明:本文章为原创,采用《知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议》进行许可