記事ディレクトリ
ドッカーとは
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 構成を使用して、コンテナの内部ポートをコンテナ上の別のポートにマップできます。ホスト。このように、複数のコンテナが同じポートを公開している場合でも、ポートを異なる方法でマッピングすることでポートの競合を回避できます。このように、異なるコンテナーではホスト ポートは同じですが、コンテナーの内部ポートは競合しません。同時に、異なるホスト ポートを使用して同じコンテナの複数のポートをマッピングできるため、より柔軟なポート管理が可能になります。複数のコンテナがマッピングに同じホスト ポートを使用する場合、ホスト ポートが競合する可能性があることに注意してください。