docker 基础及进阶命令单章
一:docker源
centos7 yum源安装
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
docker yum源安装
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
二、环境初始化
yum -y install docker-ce docker-ce-cli containerd.io
a、docekr环境
#安装docker
yum -y install docker-ce docker-ce-cli containerd.io
#docker镜像国内加速、阿里云可申请
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://4xgbe4ey.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://daocloud.io"
]
"exec-opts":["native.cgroupdriver=systemd"],
"max-concurrent-downloads":10,
"max-concurrent-uploads":5,
"log-opts":{
"max-size":"300m",
"max-file":"3"
}
"live-restore":true
}
systemctl daemon-reload
#立即启用docker并开机自启
systemctl enable docker --now
b、服务器环境
#停止防火墙
systemctl stop firewalld
systemctl disable firewalld
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sed -i 's/^SELINUX=disabled$/SELINUX=permissive/' /etc/selinux/config (或)
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
modprobe br_netfilter
cat /etc/sysconfig/modules/br_netfilter.modules
modprobe br_netfilter
cat << EOF > /etc/sysctl.d/docker.conf
vm.max_map_count=262144
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p
三、docker基础命令操作
#容器运行命令
docker run --name=zidingyi -d(后台) --restart=always(开机自启) -p(映射) 88(主机):80(容器) images
#挂载数据到外部修改(主机目录为空,容器内同为空)
docker run --name=zidingyi -d(后台) \
--restart=always(开机自启) -p(映射) 88(主机):80(容器)\
-v 主机目录:容器目录:ro(容器内只读、rw) images
#查看正在运行中的
docker ps
#查看所有
docker ps -a
#删除停止/强制删除运行的容器
docker rmi/rm -f images/id
#停止/启动容器
docker stop/start iamges
#更新配置
docker update images --restart=always
#交互式容器命令
docker exec -it id /bin/bash或/bin/sh
#容器提交改变(修改好)可生成一个新镜像
docker commit -a (作者) -m "变化标签" image_id image_new_name:ver
#镜像保存传输加载(离线操作)
docker save -o name.tar images:ver
docker load -i name.tar
docker export images_id > name.tar
cat name.tar | docker import - 仓库/image_name:version
#镜像推送到远程仓库
tag 修改镜像标签,仓库/镜像:版本都可改
docker tag local-image:tagname wangjch/images:tagname
docker login #登录docker hub
docker push wangjch/images:tagname #提交推送
docker logout
#公有镜像下载
docker pull wangjch/images:tag
#查看日志排错
docker logs image/id
#镜像的net、image、volunm 等内部细节
docker inspect image/id
#复制容器内文件到本机
docker cp id:容器目录 本机目录
docker cp 本机目录 id:容器目录
#/docker构建镜像
docker build -t java-daemon:v1.0 -f ./DockerFile
#/docker network不同服务器之间容器的互联通信以及端口映射
容器ip变动时可以通过服务名直接网络通信不受影响
docker network create net_name
docker network connect net_name container1
#同服务器下,network链接
docker run -it --network net_name image
##虚悬镜像查看删除。
docker image ls -f dangling=true
docker image prune
删除tag为none的镜像
docker rmi -f $(docker images | grep "none" | awk '{
print $3}')
##docker compose
https://docs.docker.com/compose/compose-file/
docker compose up/down 直接创建删除
##
docker swarm
##扩容
docker compose up --scale web=5
docker service scale myapp_web=5
四、docker进阶操作
注:docker部署可视化容器
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
1.部署redis中间件
docker pull redis
#docker run 使用自定义配置文件启动命令 (--privileged=true -v挂载权限不够时)(继承--volumes-from 父类name)
#创建redis.conf配置文件
docker run -v /data/redis/redis.conf:/etc/redis/redis.conf \
-v /data/myredis/data:/data/redis/data
-d --name myredis \
-p 6379:6379 \
redis:latest redis-server /etc/redis/redis.conf #(自定义启动命令\指定容器内配置文件)
2.打包docker镜像
FROM 基础镜像
RUN 容器构建是需要的命令
WORKDIR 指定创建容器后,登陆时的工作目录。
USER 指定用户
ENV 用于构建过程中设置环境变量
ADD 将宿主机的文件拷贝进镜像且自动处理url和解压tar压缩包
COPY 拷贝文件和目录到镜像中。
VOLUME 容器卷 -v
EXPOSE 端口暴露 -p
CMD 指令会被docker run后面的指令所取代。
ENTRYPOINT 容器启动时运行的命令但不会被docker run后面的命令取代,并作为参数
微服务
Dockerfile
FROM openjdk:8-jdk-slim ##环境
LABEL maintainer=wangjch
#复制本地jar包到容器内
COPY target/*.jar /app.jar
COPY target/*.yml /app.yml
##ADD app.jar docker.jar
#镜像启动命令
ENTRYPOINT ["java" ,"-jar","app.jar"]
3.docker构建镜像
docker build -t name:ver -f .
#运行容器
docker run -d -p 8080:8080 \
-v /data/app-java/app.yml:/app.yml
--name myjava java-daemon:v1.0
#推送到远程仓库
docker tag java-daemon:v1.0 wangjch/java-daemon:v1.0
docker push wangjch/java-daemon:v1.0
#拉取镜像
docker pull wangjch/java-daemon:v1.0
4.两个服务器之间docker实现相互通信,组件集群
要实现不同服务器之间的Docker容器通信,可以使用Docker的Swarm模式或Kubernetes等容器编排工具来管理多个Docker守护程序的联合。
下面是使用Docker Swarm模式实现不同服务器之间的Docker容器通信的步骤:
a、初始化Swarm:
在一台服务器上执行以下命令来初始化Swarm:
docker swarm init --advertise-addr 192.168.174.130
manager-ip是当前服务器的IP地址。
b、添加工作节点:
在其他服务器上执行以下命令,将它们作为工作节点加入Swarm集群:
docker swarm join --token <token> <manager-ip>:<manager-port>
<token>是在第一步初始化Swarm时生成的,<manager-ip>和<manager-port>是Swarm管理节点的IP地址和端口号。
查看是否加入集群
docker node ls
docker swarm join --token SWMTKN-1-054xiwsalfsvqt7xifo3n06n6xxzp61wu1luerwuuawo4yu2rh-5gvwzn4jv8si01etvo0bbarp8 192.168.174.130:2377
c、创建网络:
在Swarm管理节点上创建一个Overlay网络:
docker network create --driver overlay my-network-name
d、启动服务:
在Swarm集群中启动需要通信的容器,并将它们连接到同一个网络:
docker service create --network my-network --name my-service my-image
my-image是需要启动的Docker镜像名称。
e、连接到服务:
在其他服务器上的容器中,可以使用服务名称来连接到已启动的服务:
docker run -it --network my-network my-image bash
该命令将启动一个新容器,并将其连接到与my-service相同的网络中。
通过Swarm模式可以方便地实现不同服务器之间的Docker容器通信,并且可以使用Docker提供的其他功能来管理和扩展Docker集群。
5、某个工作节点从集群中删除
a、从 Swarm 集群中移除节点:在 Swarm 集群的管理节点上运行以下命令,将指定节点从 Swarm 集群中移除:
$ docker node rm <node-name>
其中 是要移除的节点的名称或 ID。
b、在节点上停止所有服务:在要删除的节点上运行以下命令,停止所有在该节点上运行的服务:
$ docker service ls | grep <node-name> | awk '{
print $1}' | xargs docker service rm
其中 是要删除的节点的名称或 ID。
c、停止节点上的 Docker 引擎:在要删除的节点上运行以下命令,停止 Docker 引擎:
systemctl stop docker
d、删除节点:在要删除的节点上运行以下命令,删除节点:
docker swarm leave
这将使节点离开 Swarm 集群并删除节点的本地状态。如果节点上还有容器在运行,则它们将继续在节点上运行,直到手动停止它们。
需要注意的是,将节点从 Swarm 集群中删除可能会对集群的可用性产生影响,因此在执行此操作之前应该先进行充分的计划和测试。
6、docker service 根据docker-compose.yml创建集群
可以使用 docker stack 命令根据 docker-compose.yml 文件在 Docker Swarm 中创建服务栈。以下是基本的步骤:
a、准备 docker-compose.yml 文件。
将 docker-compose.yml 文件上传到 Swarm 管理节点。
在 Swarm 管理节点上运行以下命令,将 docker-compose.yml 文件中定义的服务栈部署到 Swarm 集群中:
$ docker stack deploy -c docker-compose.yml <stack-name>
其中 是要创建的服务栈的名称。
b、查看服务栈的状态:
$ docker stack ls
这将显示在 Swarm 集群中部署的所有服务栈及其状态。
c、查看服务栈的服务:
$ docker stack services <stack-name>
查看容器所在的 Docker 集群节点
docker inspect -f '{
{
.Node.Name}}' <container_name>
这将列出在服务栈中定义的所有服务及其状态。
可以通过 docker stack 命令的其他选项和参数来配置服务栈的各种属性,例如服务数量、网络配置、容器标签等等。具体可以参考 Docker 官方文档的相关部分。