Docker环境搭建与常用命令

317 阅读2分钟

记录自己进行Docker环境搭建、常用命令操作,以及一些基础操作的步骤和过程,便于后续查阅,避免进行简单操作时还要翻阅海量文档。

Docker安装与环境配置

Docker的安装、服务启动、hello world测试只需要根据官网进行操作即可。点击跳转
在拉取Docker镜像的时候,可能会因为网络原因导致连接超时,可尝试通过修改镜像仓库地址解决:

  • 创建文件/etc/docker/daemon.json,文件内容为
{ "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] }
  • 重启服务
systemctl daemon-reload
systemctl restart docker

常用Docker命令

查询Docker版本

docker version

下载镜像

docker pull hello-world

查看镜像信息

docker images hello-world

搜索镜像

docker search [镜像名称]

运行镜像

docker run hello-world

# 指定网络启动
docker run -it --network=mynet ubuntu
# 固定静态IP启动
docker run -it --network=mynet --ip 172.22.16.8 ubuntu
# 共享网络启动(joined容器)
docker run -it --network=container:[目标容器名称] busybox

实际使用中pull指令不执行也行,因为执行run指令的时候,如果host没有镜像,Docker会自动pull镜像。另外,docker run可以看成docker createdocker start的组合,docker create是创建一个容器但是不启动的意思。

查看容器启动命令的输出信息

# if表示持续打印输出
docker logs -f 容器ID

Linux查看Docker Log存储路径(便于删除日志)

sudo ls -lh $(sudo find /var/lib/docker/containers/ -name *-json.log)

启动已有的容器

docker start 容器ID或容器名

容器自动重启

如果某些镜像如web服务器,遇到某些故障,需要它能够自动重启,可以用下面的命令。

docker run -d --restart=always httpd

#指如果启动进程退出代码非0,则重启容器,最多重启3次
docker run -d --restart=on-failure:3

容器命名

启动时命名

docker run --name "my_http_server" -d -p 80:80 httpd

重命名

docker rename my_container my_new_container

给镜像打标签

docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

TARGET_IMAGE的格式常为RegistryHost/UserName/Name:Tag

查看已有的docker镜像

docker images

查看正在运行的docker镜像

docker ps

docker container ls

容器暂停/取消暂停

当host需要CPU资源或者需要暂停容器对其文件系统做快照时,需要暂停容器。

docker pause 容器ID

解除暂停

docker unpause 容器ID

与镜像交互

启动时进入容器

# -i 以交互模式运行容器
# -t 为容器重新分配一个伪输入终端
docker run -it ubuntu

进入运行中的容器

docker exec -it 容器ID /bin/bash

docker attach 容器ID

上述两种进入容器的方法略有区别:

  • exec会在容器中打开一个新的终端,并且启动新的进程;
  • attach则进入容器启动命令的终端,不启动新的进程。 如果想直接在终端中查看启动命令的输出,可以使用attach,其他时候使用exec

退出容器

退出容器的方式,与选择进入容器的方式有关。

  • 通过docker run -it [image]进入容器,使用exit退出容器会导致容器关闭;通过CTRL+P+Q快捷键退出不会关闭容器。
  • 通过exec进入运行中的容器,使用exit退出容器不会导致容器关闭。
  • 通过attach进入运行中的容器,使用exit会导致容器关闭。

关闭某个容器

docker stop 容器ID

快速停止容器,可用kill指令(不推荐)

docker kill 容器ID

删除容器

docker rm 容器ID

批量删除容器

docker rm 容器ID1 容器ID2

批量删除所有退出的容器

# -v 不仅删除容器(如果容器有使用卷,卷也会进行相应的删除)
# -a 显示所有状态的容器
# -q 静默模式,只显示容器编号
# -f 根据条件筛选内容
docker rm -v $(docker ps -aq -f status=exited)

删除镜像

docker rmi image镜像的ID

批量删除镜像,如删除无tag的镜像。

docker rmi `docker images | awk '/^<none>/ { print $3 }'`

构建image

以构造一个jdk8环境的CentOS服务器环境为例:

方法一:docker commit

首先拉取一个基础的CentOS的镜像,并运行它:

docker run -it centos

将宿主机上的jdk安装包文件复制到docker容器的/usr/local/目录下

docker cp ./jdk-8u291-linux-x64.tar.gz [CentOS容器ID]:/usr/local/

在容器中解压jdk安装包

tar -xvf jdk-8u291-linux-x64.tar.gz

设置环境变量,修改文件/etc/profile,在后面追加下面的内容

export JAVA_HOME=/usr/local/jdk1.8.0_291
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

刷新系统变量

source /etc/profile

操作完成后执行java -version,即可看到jdk信息输出。到了这一步JAVA环境就算搭建完成,但是容器重启后会发现环境变量并没有生效,所以还需要修改/root/.bashrc文件,追加source /etc/profile,令容器每次启动的时候自动刷新环境。最后保存新镜像:

docker commit 原容器names 容器的新名字

方法二:Dokcerfile构建(推荐)

首先在一个新建目录下/usr/local/image_build新建一个名为Dockerfile的文本文件,内容为:

FROM centos
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH .:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin

这里有几点需要说明:
jdk-8u291-linux-x64.tar.gz文件必须在/usr/local/image_build目录下 jdk-8u291-linux-x64.tar.gz复制到容器中会自动解压。
然后执行构建命令(最后一个点表示Dockerfile是在当前目录,如果Dockerfile不是当前目录,需要通过-f参数指定Dockerfile文件的位置)

docker build -t 新名字 .

执行上述操作后即可得到新的镜像。

查看镜像构建历史

docker history [镜像名]

查看docker的label(常含元数据信息)

docker image inspect --format='' [镜像名]

保存镜像到远程仓库

首先登陆DockerHub

docker login

登录成功后执行命令push docker镜像

docker push [Username]/centos_jdk8

Username是必须的,如果镜像名字格式不是这个,需要用docker tag进行重命名。

client远程连接docker daemon

docker daemon默认只响应本地的client的连接请求,要想使用本地的client连接服务器上的docker daemon,需要做一些特殊的配置。测试用的是CentOS7,需要修改文件/usr/lib/systemd/system/docker.service,增加下面的配置:

完整配置如下:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

服务器需要开放2375端口允许远程访问。 配置完成后重启服务

systemctl daemon-reload
systemctl restart docker.service

接着在本地远程访问docker daemon

docker -H 192.168.1.120 info

即可看到服务器上docker的相关信息。

docker本地registry搭建

出于对安全或网速方面的考虑,可能会考虑搭建自己的docker镜像仓库,记一下搭建个人仓库的步骤。
首先在host上创建保存镜像的目录/myregistry

mkdir myregistry

启动registry镜像

docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry

根据新仓库地址重命名镜像

docker tag centos localhost:5000/[用户名]/centos

推送到新仓库

docker push localhost:5000/[用户名]/centos

docker网络

查看网络

docker network ls

image.png

查看网络详情

docker network inspect bridge

image.png

创建user-defined网络

docker network create --driver bridge mynet

# 指定IP网段
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 mynet

为容器添加指定网卡(连接指定网络)

docker network connect mynet [容器ID]

Data Volume

查看Volume

docker volume ls

查看Volume信息

docker volume inspect [volume name]

Bind Mount

docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
# 设置容器文件操作权限
docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd

docker managed volume

docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd

容器共享volume

# 创建volume container
docker create --name sharevolume \
    -v ~htdocs:/usr/local/apache2/htdocs \
    -v /other/useful/tools \
    busybox
# 启动容器时指定from volume
docker run --name web -d -p 80:80 --vlolume-from sharevolume httpd

批量删除孤儿volume

docker volume rm $(docker volume ls -q)