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

 

posted @ 2024-03-28 15:30  小匡程序员  阅读(4)  评论(0编辑  收藏  举报