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

attachexec不同的是执行了exit也会停止容器的运行。如果不想停止运行可以使用默认的快捷键ctrl-p ctrl-q来退出。

但是上面的快捷键使用了ctrl-p,所以会导致docker容器内的终端ctrl-p的行为很怪异,因为通常情况下这个快捷键是用来翻命令历史的。

解决办法是在docker的配置文件,通常是~/.docker/config.json,添加如下内容,也就是把原来的快捷键替换为ctrl-@

{
    "detachKeys": "ctrl-@"
}

然后重启容器即可。

docker-compose

用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方案可以轻松的进行版本切换(改镜像的版本即可)。