Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。docker容器类似虚拟机,可以执行包含启动,停止,删除等。每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。docker的镜像概念类似虚拟机的镜像。是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
//Ubuntu安装docker
sudo apt install docker.io
//CentOS安装docker
sudo yum install docker.io
//验证是否安装成功
docker
//卸载引擎Ubuntu
sudo apt-get purge docker.io
//卸载引擎Centos
sudo yum remove docker.io
//删除Docker数据目录
sudo rm -rf /var/lib/docker
docker --help #查看所有的指令 帮助指令
#镜像操作
docker images #查看所有的镜像 -a列出所有镜像 -q只显示镜像ID
docker inspect [image ID] #根据镜像ID获取镜像的详细信息
docker tag [旧名称]:[旧标签] [新名称]:[新标签] # 修改镜像的名称和标签
docker rmi [标签]/[镜像ID] #删除镜像
docker save -o [保存路径]/[文件名].tar [镜像名称]:[版本号] / [镜像ID] #导出镜像
docker load -i [保存路径]/[文件名].tar #导入镜像
##通过镜像ID导出的镜像没有名字 推荐使用镜像名称导出镜像包
docker save -o package.tar testname:1.0.0 #导出压缩包
sudo tar -zcvf package.tar.gz package.tar
docker save testname:1.0.0 | gzip > package.tar.gz
docker load -i package.tar.gz #导入压缩之后的镜像包
docker load --name myimage:v1.0 --label "version=v1.0" myimage.tar #load的时候指定镜像的名称
#容器操作
docker create -it [镜像ID]/[镜像名称] #创建镜像 -i容器输入保持打开 -t docker分配伪终端
docker start [容器ID/容器名称] #启动容器
docker stop [容器ID/容器名称] #停止容器
docker restart [容器ID/容器名称] #重启容器
docker run [选项] 镜像名 /bin/bash #创建并启动一个容器
docker ps #查看处于运行状态的容器 -a 显示所有容器 -q只显示ID -aq 显示所有的ID -s显示容器大小
docker exec [option] [容器ID/容器名称] #进入容器 -i容器输入保持打开 -t分配一个伪终端 -c避免交互直接在容器内执行命令
#sudo docker exec -it ec39c06d549b /bin/bash
#exit 或者 Ctrl+D退出编辑器
docker logs container_id #查看容器内的标准输出
docker export container_id > ubuntu.tar #导出docker本地容器
cat docker/ubuntu.tar | docker import - test/docker:V1 #从容器快照导入为镜像test/docker:V1
docker import http://url.addr #通过指定URL来导入镜像
docker port #查看端口的绑定情况
#docker port adoring_stonebraker 5000
#网络查询
docker network create -d bridge test-net #新建一个docker网络
docker network ls #查看网络列表
docker run -itd --name test1 --network test-net ubuntu /bin/bash #运行一个容器并连接到新建的test-net网络
docker export [容器ID/名称] > 文件名 #容器的导出
cat [文件名] | docker improt [生成的镜像名称:标签] #容器的导入
docker rm [容器名称/ID] #删除容器
docker commit [选项] [容器ID或容器名] [仓库名:标签] #将容器创建为镜像
#-a 修改人 -m备注 -c使用dockerfile指令来创建 -p commit的时候暂停容器
docker stop $(docker ps -a -q) #停止所有容器
docker rm $(docker ps -a -q) #删除所有容器
sudo docker create -it --name=[容器名称] [镜像ID/镜像名称] /bin/bash ##以特定名称创建容器容器
docker ps -a --no-trunc ## 查看容器的详细运行命令
docker version #查看版本
docker info #查看容器的安装情况
docker network ls #查看网络列表
docker network cat #自建bridge网络
docker cp [容器ID:绝对路径] [绝对路径(物理机)] #容器文件拷贝到物理机
docker cp [绝对路径(物理机)] [容器ID:绝对路径] #物理机文件拷贝到容器
docker pull #从远程拉取一个镜像
docker push #将一个镜像推送到远程仓库
docker build #构建容器镜像
docker pause #暂停容器中的所有进程
docker top #查看容器中运行的进程信息
docker stat # 显示容器资源的使用情况
#创建并运行容器
docker run -d -p 1935:1935 -p 8080:80 -p 8554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp --name my_docker official:master \
-v /home/docker/media/bin:/opt/media/bin -v /home/docker/conf:/opt/media/conf
#这个命令的各个参数含义如下:
#-d 让 Docker 容器在后台运行
#-p 1935:1935:将主机的1935端口映射到容器的1935端口
#-p 8080:80:将主机的8080端口映射到容器的80端口
#-p 8554:554:将主机的8554端口映射到容器的 554 端口
#-p 10000:10000:将主机的10000端口映射到容器的 10000 端口
#-p 10000:10000/udp:将主机的 10000 端口映射到容器的 10000 端口,并设置为 UDP 协议
#-p 8000:8000/udp:将主机的 8000 端口映射到容器的 8000 端口,并设置为 UDP 协议
#--name my_dockert:将容器命名为 my_docker
# official:master:要运行的容器镜像
#-v /home/docker/media/bin:/opt/media/bin 映射本地目录到容器
#-v /home/docker/conf:/opt/media/conf 映射本地目录到容器
#判断是否安装了docker
if ! [ -x "$(command -v docker)" ]; then
echo 'Docker is not installed.'
exit 1
else
echo "Docker has installed."
fi
#判断容器是否存在
container_name="test_container"
if [[ "$(sudo docker ps -a | grep ${container_name} | grep -v 'grep')" != "" ]]; then
echo "${container_name} 容器已经存在"
else
echo "${container_name} 容器不存在"
fi
#判断容器是否在运行
if [ "$(sudo docker inspect -f '{{.State.Running}}' ${container_name} 2>/dev/null)" == "true" ]; then
echo "${container_name} 容器正在运行"
else
echo "${container_name} 容器停止运行"
fi
#判断镜像是否存在
if [[ "$(sudo docker images -q ${image_name} 2> /dev/null)" != "" ]];then
echo "'${image_name}' docker image has loaded"
else
echo "'${image_name}' docker image not loaded"
fi
1.Docker容器之间会出现端口冲突吗?
会, 我们可以通过端口映射来解决这个问题, 在容器启动时,可以使用Docker CLI或Docker Compose配置将容器内部的端口映射到宿主机的不同端口上。这样,即使多个容器暴露相同的端口,也可以通过不同的映射端口来避免端口冲突。 这样,在不同的容器中,宿主机的端口相同,但是容器的内部端口不会冲突。同时, 可以使用不同的宿主机端口来映射同一容器的多个端口,这样可以更灵活地管理端口。需要注意的是,当多个容器使用相同的宿主机端口进行映射时,宿主机的端口可能会出现冲突。