docker基础操作
安装:
参考
https://www.runoob.com/docker/centos-docker-install.html(安装)
https://www.php.cn/faq/484843.html(网络模式)
https://www.mszlu.com/docker/05/05.html#_2-dockerfile(码神)
方式1:使用官方安装脚本自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
方式2:手动安装
#yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #安装稳定源 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装最新版本的 Docker Engine-Community 和 containerd sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin #启动 sudo systemctl start docker sudo docker run hello-world
卸载
#docker yum remove docker-ce #删除镜像、容器、配置文件等内容: rm -rf /var/lib/docker
一、docker卸载 1、如果已经启动,请先停止docker服务,执行命令: systemctl stop docker 2、查看yum安装的docker包,执行命令: yum list installed |grep docker 有yum的doker包的话卸载,执行命令 yum -y remove docker*
yum -y remove containerd.io.x86_64
3、查看docker的rpm包执行命令: rpm -qa |grep docker 4、删除docker目录 rm -rf /var/lib/docker (默认的目录)
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
docker命令整理
image镜像操作
docker images [OPTIONS] [REPOSITORY[:TAG]] docker rmi [OPTIONS] IMAGE [IMAGE...] docker login -u 用户名 -p 密码 [SERVER] #默认是官方仓库 docker logout docker search -f stars=10 java #从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像 --automated :只列出 automated build类型的镜像; --no-trunc :显示完整的镜像描述; -f <过滤条件>:列出收藏数不小于指定值的镜像。
docker pull [OPTIONS] NAME[:TAG|@DIGEST]#从镜像仓库中拉取或者更新指定镜像,如果不声明tag,默认拉取latest版本。可以通过https://hub.docker.com/ 搜索该镜像,查看支持的 tag 信息。
docker push [OPTIONS] IMAGE[:TAG]# 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker build -t imagesName[:tag] . #创建镜像,基于当前目录的 Dockerfile文件
容器操作
#操作类:启动 docker run -p 80:80 -v /data:/data -d nginx:latest #后台方式,宿主:容器 docker run -p 80:80 -v /data:/data -it nginx:latest #交互方式 --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 --name="conName": 为容器指定一个名称; --volume , -v: 绑定一个卷 docker start/stop/restart [OPTIONS] CONTAINER [CONTAINER...] docker pause/unpause CONTAINER [CONTAINER...] docker exec -it 9df70f9a0714 /bin/bash
#操作类:批量
docker stop $(docker ps -a -q) #停止所有容器
docker rm $(docker ps -a -q)#删除所有容器 #查询类 docker ps [OPTIONS] docker stats [OPTIONS] [CONTAINER...] docker top [OPTIONS] CONTAINER docker inspect [OPTIONS] NAME|ID [NAME|ID...]
运行容器举例
docker run ubuntu:15.10 /bin/echo "Hello world"
各个参数解析:
docker: Docker 的二进制执行文件。
run: 与前面的 docker 组合来运行一个容器。
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
docker的网络模式
参考:https://www.php.cn/faq/484843.html
Docker网络模式 | 配置 | 说明 | 备注 |
---|---|---|---|
host模式 | –net=host | 容器和宿主机共享Network namespace。 | 相关于vmware的桥接模式,与主机共享同一个网络中 |
container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
新创建的容器和已经存在的一个容器共享一个 Network Namespace;必须指定一个容器 |
none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 | 不能联网 |
bridge模式 | –net=bridge | (默认为该模式) | 相当于vmware的nat模式,需要做端口映射 |
容器间通信
容器之间要互相通信,必须要有属于同一个网络的网卡;
两个属于同一个网络的容器是可以进行网络通信的,但是 IP 地址可能是不固定的,有被更改的情况发生
docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。要在创建容器时使用 --name
为容器命名
只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络
自定义网络
#创建自定义网络
docker network create custom_network
#删除
docker network rm custom_network
#查看网络列表
docker network ls
#查看某个网络的使用详情
docker network inspect network_name
镜像构建
参考:https://www.mszlu.com/docker/05/05.html#_2-dockerfile
基于操作系统+自定义环境+生成镜像:建议
# 拉取镜像 docker pull centos:7 # 创建容器 docker run -di --name centos7 centos:7 #进入容器 docker exec -it centos7 /bin/bash #构建属于自己的服务器环境 #nginx #php #node #golang #打包 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] docker commit -a="kz" -m="jnginx and php,golang,node" centos7 mycentos:7 #使用自定义的容器 docker run -di --name mycentos7 -p 80:80 mycentos:7
基于Dockerfile:FROM官方镜像源,存在Dockerfile且合适的官方镜像时可用
关键指令:WORKDIR
FROM <image>:<tag> #FROM centos:7 RUN <command>#构建镜像时运行 ADD <src>... <dest> #拷贝文件或目录到镜像中。src 可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压。
#还可以是一个 url,如果把 src 写成一个 url,那么 ADD 就类似于 wget 命令,然后自动下载和解压。
COPY <src>... <dest> #不支持自动下载和自动解压
EXPOSE <port> [<port>/<protocol>...] #暴露容器运行时的监听端口给外部,如果想使得容器与宿主机的端口有映射关系,必须在容器启动的时候加上 -p 参数 ENV <key> <value> 添加单个,ENV <key>=<value> ... 添加多个 CMD ["executable","param1","param2"] #在 Dockerfile 中只能有一条 CMD 指令。如果设置了多条 CMD,只有最后一条 CMD 会生效 WORKDIR /path/to/workdir #为 RUN、CMD以及AND 设置工作目录。 VOLUME 一般不会在 Dockerfile 中用到,更常见的还是在 docker run 的时候通过 -v 指定数据卷
举例1:
# 指明构建的新镜像是来自于 centos:7 基础镜像 FROM centos:7 # 通过镜像标签声明了作者信息 LABEL maintainer="mszlu.com" # 设置工作目录 WORKDIR /usr/local # 新镜像构建成功以后创建指定目录 RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat # 拷贝文件到镜像中并解压 ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java ADD apache-tomcat-9.0.59.tar.gz /usr/local/tomcat # 暴露容器运行时的 8080 监听端口给外部 EXPOSE 8080 # 设置容器内 JAVA_HOME 环境变量 ENV JAVA_HOME /usr/local/java/jdk-11.0.8/ ENV PATH $PATH:$JAVA_HOME/bin # 启动容器时启动 tomcat CMD ["/usr/local/tomcat/apache-tomcat-9.0.59/bin/catalina.sh", "run"] #构建镜像 docker build -f /usr/local/dockerfile/Dockerfile -t mscentos:7 .
# 创建容器
docker run -di --name mscentos7 -p 8080:8080 mscentos:7
docker-compose:容器编排
安装和卸载
下载地址: https://github.com/docker/compose/releases(选择相应的docker-compose版本)
sudo curl -L "https://github.com/docker/compose/releases/download/2.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
卸载:
rm /usr/local/bin/docker-compose
找到配置文件和工作目录是编排的关键
服务的config:服务启动配置
workdir:代码执行的位置
data目录:持久化
nginx: image: nginx hostname: nginx1 container_name: nginx-docker1 restart: always ports: - "80:80" expose: - "80" networks: - docker_net volumes: - /data/docker/nginx/data:/etc/nginx hyperf_demo: image: my-php-hyperf hostname: my-php-hyperf1 container_name: my-php-hyperf1 restart: always environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=123456 #依赖的服务名 depends_on: - nginx command: php /www/bin/hyperf.php start ports: - "9501:9501" expose: - "9501" networks: - docker_net #network_mode: "host" volumes: - /data/docker/mongodb/data:/data/db