Docker基本使用

配置阿里云镜像加速

编辑vi /etc/docker/daemon.json

{"registry-mirrors": ["https://5xok66d4.mirror.aliyuncs.com"] }

重启systemctl daemon-reload && systemctl restart docker

搜索docker镜像

  • 查看本地镜像 docker images

  • 搜索镜像docker search centos

  • 搜索镜像并过滤是官方的docker search --fifilter "is-offiffifficial=true" centos

  • 搜索镜像并过滤大于多少颗星星的:docker search --fifilter stars=10 centos

  • 下载centos7镜像:docker pull centos:7

  • 修改本地镜像名字(小写)docker tag centos:7 mycentos:1

  • 本地镜像的删除:docker rmi centos:7

docker容器的构建、查看、停止、重启

  • 构建容器:docker run -itd --name=mycentos centos:7

    • -i :表示以交互模式运行容器(让容器的标准输入保持打开)
    • -d:表示后台运行容器,并返回容器ID
    • -t:为容器重新分配一个伪输入终端
    • –name:为容器指定名称
  • 查看本地所有的容器:docker ps -a

  • 查看本地正在运行的容器:docker ps

  • 停止容器:docker stop CONTAINER_ID / CONTAINER_NAME

  • 一次性停止所有容器:docker stop $(docker ps -a -q)

  • 启动容器:docker start CONTAINER_ID / CONTAINER_NAME

  • 重启容器:docker restart CONTAINER_ID / CONTAINER_NAME

  • 删除容器:docker rm CONTAINER_ID / CONTAINER_NAME

  • 强制删除容器:docker rmi -f CONTAINER_ID / CONTAINER_NAME

  • 查看容器详细信息:docker inspect CONTAINER_ID / CONTAINER_NAME

  • 进入容器:docker exec -it 0ad5d7b2c3a4 /bin/bash

Docker容器与宿主机的文件复制与挂载

  • 从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径

    • docker cp /root/123.txt mycentos:/home/
  • 从容器复制到宿主机:docker cp 容器名字/ID:容器路径 宿主机本地路径

    • docker cp mycentos:/home/456.txt /root
  • 宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 镜像ID

    • docker run -itd -v /root/xdclass/:/home centos:7

构建自定义docker镜像

1.Docker Commit构建自定义镜像

docker commit 4eb9d14ebb18 mycentos:7
或
docker commit -a "XD" -m "mkdir /home/xdclass" 4eb9d14ebb18 mcentos:7
	-a:标注作者
	-m:说明注释

2.Dockerfile构建自定义镜像

  • Dockerfile
# this is a dockerfile
FROM centos:7
MAINTAINER hui 2303058491@qq.com
RUN echo "正在构建镜像"
WORKDIR /home/xdclass
COPY 2303.txt /home/test
RUN yum install -y net-tools
  • 构建 docker build -t mycentos:v2 .
  • 查看:docker images

Docker镜像分层结构

image-20201006202613705

  • 总结
    • 共享资源
    • 对容器的任何改动都是发生在容器层
    • 容器层是可写可读,而镜像层只读

Dockerfile基础指令

FROM 基于哪个镜像、
MAINTAINER 注明作者
COPY 复制文件进入镜像(只能用相对路径,不能用绝对路径)
ADD 复制文件进入镜像(假如文件是.tar.gz文件会解压,sql文件会执行)
WORKDIR 指定工作目录,假如路径不存在会创建路径
ENV 设置环境变量
EXPOSE 暴露容器端口
RUN 在构建镜像的时候执行,作用于镜像层面
ENTRYPOINT 容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
CMD 
	在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
	容器启动后执行默认的命令或者参数,允许被修改
命令格式:
	- shell命令格式:RUN yum install -y net-tools
	- exec命令格式:RUN [ "yum","install" ,"-y" ,"net-tools"]

Dockerfile构建java环境

  • Docker file
FROM centos:7
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
  • 制作java镜像
docker build -t mycentos:java .
  • 启动容器
docker run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT mycentos:jdk /bin/bash

Dockerfile构建nginx镜像

  • Docker file
FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/local COPY nginx_install.sh /usr/local RUN sh /usr/local/nginx_install.sh EXPOSE 80
  • nginx_install.sh
#!/bin/bash
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local/nginx && make && make install
  • 制作nginx镜像
docker build -t mycentos:nginx .
  • nginx镜像启动注意

    • 在容器里nginx是以daemon方式启动,退出容器时,nginx程序也会随着停止:/usr/local/nginx/sbin/nginx

    • 使用前台方式永久运行:/usr/local/nginx/sbin/nginx -g "daemon off;"

  • 启动nginx镜像

    • docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"

Docker网络模式

  • 默认的三种网络模式

    docker network ls 查看容器网络模式
     - bridge:桥接模式
     - host:主机模式 //使用主机端口
     - none:无网络模式 //无法连接外网

Docker容器Link实现单向通信

  • 启动mysql数据库容器:

    docker run --name mydb -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7

  • 启动tomcat应用容器并link到mysql数据库:

    docker run -itd --name tomcat1 --link mydb tomcat:tag #mydb容器一定要存在

  • 官方版的mysql5.7需要安装工具才能有ping命令

    apt-get update && apt-get install iputils-ping

Docker容器bridge网桥实现双向通信

创建一个新的网桥: docker network create -d bridge my_bridge 
启动第一个容器: docker run -itd --name tomcat centos:7 
启动第二个容器: docker run -itd --name redis centos:7 
把第一个容器加入网桥: docker network connect my_bridge tomcat 
把第二个容器加入网桥: docker network connect my_bridge redis 
最后分别进入俩个容器中进行验证
  • Docker容器的特权模式
    • 可以删除网关….

Docker Volume数据共享

  • dockerfile
FROM centos:7
VOLUME ["/usr/local"]
  • 注意:在dockerfile里设置volume是无法修改宿主机的挂载路径的

  • 使用volume容器共享创建nginx集群

    • 使用–volumes-from 实现容器与容器之间volume共享

    • 创建nginx1

      • docker run -itd -p 8080:80 -v /usr/local/nginx/html:/usr/local/nginx/html –name nginx1

        mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”

    • 创建nginx2

      • docker run -itd -p 8081:80 –volumes-from nginx1 –name nginx2 mycentos:nginx

        /usr/local/nginx/sbin/nginx -g “daemon off;”

    • 创建nginx3

      • docker run -itd -p 8082:80 –volumes-from nginx1 –name nginx3 mycentos:nginx

        /usr/local/nginx/sbin/nginx -g “daemon off;”

Docker-Compose使用

  • 一个简单的dock er-compose.yml

    version: '3' 
    services:
      redis:
        image: mycentos:redis
  • compose操作容器(一定要进入配置文件目录)

    • 后台启动容器:docker-compose up -d
    • 查看容器运行情况:docker-compose ps
    • 停止并删除容器:docker-compose down
    • 停止并删除容器并删除volume:docker-compose down --volumes
    • 停止启动容器:docker-compose stop;docker-compose start
    • docker-compose exec的使用:docker-compose exec redis bash
  • 总结:

    • 操作docker-compose一定要在配置文件docker-compose.yml文件路径下操作 格式一定要注意,该空格要空格

docker-compose 基本使用

docker-compose.yml的三大部分:version,services,networks,最关键是services和networks两个部分 compose设置网络模式
compose使用端口映射
compose设置文件共享
compose管理多个容器

docker-compose.yml

version: '3.3' services:
db:
image: mysql:5.7 volumes:
- db_data:/var/lib/mysql
自定义,必须与下面对应)
     restart: always
     environment:
#docker run -itd mysql:5.7
#采用的是卷标的形式挂载(注意:- db_data是参数,可以变,
#自动重启,保证服务在线
       MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_ROOT_PASSWORD= somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
#指定环境变量 docker -itd -e
- db # - db 是参数,合起来的意思是只有当上面的mysql数据库安装成功后,这个wordpress才可以 被安装,还有一个功能,就是docker --link 将上面的mysql数据库,与这个wordpress应用连起来
     image: wordpress:latest
     ports:
- 8000:80 restart: always environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}

docker-compose中有两种方式可以设置volumes

  • 使用具体路径直接挂载到本地,特点就是直观
  • 使用卷标的形式,特点就是简洁,但是不知道数据到底在本地的什么位置。需要通过卷标查看
    • docker volume ls
    • docker volume inspect wordpress_db_data

update users set password='$2b$10$PhyKg3QCeZ9FsmwU9GnHoOZf7FbhFIJM9XaeTZ2nx8UWbvoq5EcRG' where id = 1;


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!