Docker命令大全与脚本使用

文章目录

    • 什么是Docker
    • Docker的安装和卸载
    • Docker的基本命令
      • 镜像操作命令
      • 容器操作命令
    • 解析复合指令
    • 脚本调用
    • 常见问题解析

什么是Docker

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。docker容器类似虚拟机,可以执行包含启动,停止,删除等。每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。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的基本命令

镜像操作命令

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配置将容器内部的端口映射到宿主机的不同端口上。这样,即使多个容器暴露相同的端口,也可以通过不同的映射端口来避免端口冲突。 这样,在不同的容器中,宿主机的端口相同,但是容器的内部端口不会冲突。同时, 可以使用不同的宿主机端口来映射同一容器的多个端口,这样可以更灵活地管理端口。需要注意的是,当多个容器使用相同的宿主机端口进行映射时,宿主机的端口可能会出现冲突。

你可能感兴趣的:(自动化,docker,容器,运维)