记录自己进行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 create与docker 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
查看网络详情
docker network inspect bridge
创建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)