docker 基础命令

docker

安装

更新系统

sudo apt update
sudo apt -y dist-upgrade

安装docker

sudo apt-get -y install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

开启远程访问api

sudo vim /lib/systemd/system/docker.service
# 找到ExecStartExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 
# 修改为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# 保存退出。

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
curl http://ip:2375/version

Docker 架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

docker 基础命令_第1张图片

命令篇

镜像加速

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://2zoicnee.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

查找镜像

sudo docker search ubuntu
sudo docker search centos
sudo docker search nginx

拉取镜像

sudo docker pull 镜像名称:版本

如果不写版本号 默认版本为 latest

sudo docker pull ubuntu:24.04
sudo docker pull centos:centos7
sudo docker pull nginx
sudo docker pull mysql
sudo docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c

查看本地镜像

sudo docker images
选项 说明
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像创建时间
SIZE 镜像的大小

同一个仓库源可以有多个TAG 代表这个仓库的不同个版本

系统镜像运行容器

参数说明

参数 说明
-i 交互式操作 即使没有附加也会保持 STDIN 打开
-t 分配伪终端
-d 分离模式 在后台运行
/bin/bash 使用那个shell环境
sh 使用那个shell环境
–rm 容器停止后自动删除容器
sudo docker run -itd ubuntu:24.04

查看容器

sudo docker ps 查看运行中的容器

sudo docker ps -a 查看所有容器包括没有运行的容器

sudo docker ps
sudo docker ps -a

停止容器

sudo docker stop 容器ID 
sudo docker kill 容器ID 

启动容器

sudo docker start 容器ID 

进入正在运行的容器

sudo docker exec -it 容器ID /bin/bash

从正在运行的容器终端退出到宿主主机

exit

删除容器

删除未运行的容器

sudo docker rm 容器ID

删除运行中的容器

sudo docker rm -f 容器ID

删除镜像

如果不写版本号 默认版本为 latest

sudo docker rmi 镜像名称:版本

指定容器名

-p 端口映射 物理主机端口:容器主机端口

–name 容器名

sudo docker run -d -p 81:80 --name nginx01 nginx

容器退出时删除容器

–rm

sudo docker run -d -p 82:80 --rm --name nginx02 nginx

容器重启策略

–restart=always
–restart=always 表示容器退出时,docker会总是自动重启这个容器
–restart=on-failure:3 表示容器的退出状态码非0(非正常退出),自动重启容器,3是自动重启的次数。超过3此则不重启
–restart=no 默认值,容器退出时,docker不自动重启容器
–restart=unless-stopped 表示容器退出时总是重启,但是不考虑docker守护进程运行时就已经停止的容器

sudo docker run -d -p 83:80 --restart=always --name nginx03 nginx

环境变量

-e

sudo docker run --restart=always -p 3306:3306 -p 33060:33060 \
-e TZ=Asia/Shanghai \
--volume /etc/timezone:/etc/timezone:ro \
--volume /etc/localtime:/etc/localtime:ro \
--volume /home/lhz/docker/mysql/data:/var/lib/mysql \
--name mysql-test -e MYSQL_ROOT_PASSWORD=lihaozhe -d mysql

限制CPU和内存

–cpus CPU数量

–memory 内存大小 单位 b kb m g

sudo docker run -d -p 85:80 --rm --cpus 2 --memory 256m --name nginx05 nginx
sudo docker stats nginx05

查看容器日志

-f 追踪实时日志

-t 现实时间戳

sudo docker logs -ft nginx05

容器卷

sudo docker run -d -p 86:80 --rm --name nginx06 nginx
sudo docker inspect nginx06 | grep UpperDir
sudo ls -l /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff
sudo mkdir /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff/aa
sudo mkdir /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff/bb
sudo mkdir /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff/cc
sudo docker exec -it nginx06 /bi
ls
mkdir /dd
exit
sudo ls -l /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff
sudo docker stop nginx06

当容器删除后 数据卷和容器一起被删除

匿名绑定

-v 就是 --volume

-v 容器中的路径 这就是匿名绑定

Source 物理主机路径

Destination 容器主机路径

"Mounts": [
            {
                "Type": "volume",
                "Name": "a6c2be4750a24e2384e87a60c55961f0f2ffe4f0def0bc084ee2c77f79071e6a",
                "Source": "/var/lib/docker/volumes/a6c2be4750a24e2384e87a60c55961f0f2ffe4f0def0bc084ee2c77f79071e6a/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

sudo docker run -d -p 10007:80 -v nginx-volume:/usr/share/nginx/html --name nginx-volume nginx
sudo docker inspect nginx-volume
su root
cd /var/lib/docker/volumes/49114e1e1a6f6c9b57ca4c3aa380dd4b40807e389f089f0b0ed64581b27089a9/_data
sudo docker volume prune
ls /var/lib/docker/volumes
选项 说明
create 创建数据卷
inspect 显示数据卷详情
ls 列表方式显示数据卷
prune 删除不使用的数据卷
rm 删除数据卷

具名绑定

-v 就是 --volume

-v 数据卷名:容器中的路径 这就是具名绑定

Source 物理主机路径

Destination 容器主机路径Bind Mount

"Mounts": [
            {
                "Type": "volume",
                "Name": "nginx-volume",
                "Source": "/var/lib/docker/volumes/nginx-volume/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ]
sudo docker volume create nginx-volume
sudo docker volume ls 
sudo docker run -d -p 10008:80 -v nginx-volume:/usr/share/nginx/html --name nginx-volume nginx
sudo docker inspect nginx-volume
sudo docker stop nginx-volume
sudo docker rm nginx-volume
sudo docker volume rm nginx-volume
ls /var/lib/docker/volumes

Bind Mount

-v 就是 --volume

-v 物理机路径:容器中的路径 Bind Mount

Source 物理主机路径

Destination 容器主机路径

sudo docker run --name nginx-test --rm -d -p 80:80 nginx
# 准备 nginx 容器与本地文件映射文件目录
# /home/lhz/nginx/html 存放网页文件
# /home/lhz/nginx/conf.d 存放配置文件
mkdir -p /home/lhz/nginx/html /home/lhz/nginx/conf.d
# docker cp:用于容器与主机之间的数据拷贝
# 从容器中拷贝文件到本地
sudo docker cp nginx-test:/usr/share/nginx/html /home/lhz/nginx
sudo docker cp nginx-test:/etc/nginx/conf.d/default.conf /home/lhz/nginx/conf.d
sudo docker cp nginx-test:/etc/nginx/nginx.conf /home/lhz/nginx
# 删除现有nginx容器
sudo docker stop nginx-test
sudo docker run -d -p 80:80 \
-v /home/lhz/nginx/html:/usr/share/nginx/html \
-v /home/lhz/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/lhz/nginx/nginx.conf:/etc/nginx/nginx.conf \
--name nginx-test --restart=always nginx

容器卷之间的继承

Linux Namespace:Docker利用namespace技术,使得每个容器都有其自己的进程、网络、挂载、用户ID等独立的空间2。这保证了容器与容器之间以及容器与主机之间的隔离性。

Capabilities:Linux capabilities允许将传统的root权限分割成多个不同的能力,例如CAP_NET_ADMIN能力允许操作网络配置,CAP_CHOWN能力允许改变文件所有权。Docker默认情况下会赋予容器一些必要的capabilities,但不包括全部的能力,从而降低了被攻击的风险。

–privileged=true

–cap-add 和 --cap-drop

sudo docker run --privileged=true -d -p 81:80 \
-v /home/lhz/nginx/html:/usr/share/nginx/html \
-v /home/lhz/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/lhz/nginx/nginx.conf:/etc/nginx/nginx.conf \
--name nginx-test01 nginx
sudo docker run --privileged=true -d -p 82:80 \
--name nginx-test02 --volumes-from nginx-test01 nginx

网络

sudo docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
04c3e195464d   bridge    bridge    local
87a5608d0164   host      host      local
ae3e9c6a7a79   none      null      local

自定义网络

sudo docker network create --driver bridge --subnet 192.168.95.0/24 --gateway 192.168.95.1 lihaozhe
sudo docker network rm lihaozhe
sudo docker network create --subnet=192.168.90.0/24 --gateway=192.168.90.1 \
 -o "com.docker.network.bridge.name"="docker1" bigdata 
sudo docker run --privileged=true --network=bigdata --ip=192.168.90.2 -itd \
 --name hadoop --hostname hadoop centos:7 /usr/sbin/init

自定义镜像

sudo docker exec -it hadoop /bin/bash
yum -y update
yum -y install epel-release
yum -y install gcc gcc-c++ autoconf automake cmake make \
 zlib zlib-devel openssl openssl-devel pcre-devel \
 rsync openssh-server openssh-clients vim man zip unzip net-tools tcpdump lrzsz tar wget \
 systemd hostname initscripts 
hostname hadoop
mkdir /opt/soft
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
passwd root
systemctl start sshd
systemctl enable sshd
exit
sudo docker stop hadoop
sudo docker commit -m "hadoop base" -a "lihaozhe" hadoop hadoop:base1.0

大数据环境

sudo docker run --privileged=true --network=bigdata --ip=192.168.90.10 -itd --name master --hostname master \
 --add-host=master:192.168.90.10 --add-host=slave1:192.168.90.11 --add-host=slave2:192.168.90.12 \
 -v /opt/master:/opt/soft --restart=always hadoop:base1.0 /usr/sbin/init
sudo docker run --privileged=true --network=bigdata --ip=192.168.90.11 -itd --name slave1 --hostname slave1  \
 --add-host=master:192.168.90.10 --add-host=slave1:192.168.90.11 --add-host=slave2:192.168.90.12 \
 -v /opt/slave1:/opt/soft --restart=always hadoop:base1.0 /usr/sbin/init
sudo docker run --privileged=true --network=bigdata --ip=192.168.90.12 -itd --name slave2 --hostname slave2  \
 --add-host=master:192.168.90.10 --add-host=slave1:192.168.90.11 --add-host=slave2:192.168.90.12 \
 -v /opt/slave2:/opt/soft --restart=always hadoop:base1.0 /usr/sbin/init
sudo docker exec -it master /bin/bash

你可能感兴趣的:(Java,云计算,大数据,大数据,容器,docker,云计算)