概念

1.Docker是一个开源的应用容器引擎,
2.容器可以看做在Linux系统下的一个隔离的进程,包含了应用以及应用的运行环境
3.可以将容器打包成镜像放到远程仓库,后续其他Linux服务器可以从远程仓库下载镜像,实现一次构建,随处运行,减轻服务器部署压力。

安装

yum -y install gcc
yum -y install gcc-c++
yum install -y yum-utils
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl start docker
cd /etc/docker/
vim daemon.json
{
"registry-mirrors": [
        "https://docker.registry.cyou",
        "https://docker-cf.registry.cyou",
        "https://dockercf.jsdelivr.fyi",
        "https://docker.jsdelivr.fyi",
        "https://dockertest.jsdelivr.fyi",
        "https://mirror.aliyuncs.com",
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.sjtug.sjtu.edu.cn",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.iscas.ac.cn",
        "https://docker.rainbond.cc",
        "https://docker.xuanyuan.me",
        "https://doublezonline.cloud",
        "https://dislabaiot.xyz",
        "https://docker.fxxk.dedyn.io"
    ]
}
systemctl daemon-reload
systemctl restart docker
docker run hello-world
systemctl enable docker

命令

镜像命令

docker images
docker pull redis
docker pull redis:6.0.8
docker rmi -f imageId
# 镜像迁移
docker save -o /redis-7.0.15.tar redis:7.0.15
docker load -i /redis-7.0.15.tar
# 虚悬镜像(仓库名、标签名都是 <none>的镜像),在构建或者删除镜像时可能由于一些错误导致出现虚悬镜像
docker image ls -f dangling=true # 查看所有虚悬镜像
docker image prune # 删除所有虚悬镜像

容器命令

docker run -it --name=tomcat -p 8080:8080 tomcat /bin/bash  # 前台交互
docker run -d --privileged=true -v 宿主机绝对路径:容器绝对路径 --name=u1 ubuntu /bin/bash # 挂在数据卷(数据持久化到宿主机磁盘)
docker run -d --privileged=true --volumes-from u1 ubuntu /bin/bash # 创建新容器,数据卷挂载规则继承u1的
# exit退出时,容器也会停止
# CTRL P Q 停止时容器会继续运行
docker run -d --name=tomcat -p 8080:8080 tomcat  # 后台启动
docker ps
docker ps -a
docker start 容器id
docker stop 容器id
docker rm -f 容器id
docker ps -a -q | xargs docker rm -f # 删除所有容器
docker exec -it Tomcat /bin/bash # 进入容器内部,通过exit退出时,容器不会停止
docker cp 容器ID:容器内路径 目的主机路径
docker cp 主机路径 容器ID:容器内路径
docker export tomcat > tomcat.tar
cat tomcat.tar | docker import - atguigu/tomcat:3.2.1 # 创建镜像
docker commit -m="第一次提交" -a="jiangrenbao" u2 atguigui/myubuntu2:4.5.6 # 根据容器创建新镜像

Registry搭建docker私库

docker pull registry
docker run -d -p 5000:5000 -v /dockerRegistry/:/tmp/registry --privileged=true registry # 启动私库
curl -XGET http://localhost:5000/v2/_catalog # 查看私库有哪些镜像
docker tag ubuntu localhost:5000/myubuntu:5.0 # 修改待推送镜像的tag
vim /etc/docker/daemon.json # docker默认不允许http方式推送镜像,通过新增该配置取消限制
"insecure-registries": ["localhost:5000"]
systemctl restart docker
docker run -d -p 5000:5000 -v /dockerRegistry/:/tmp/registry --privileged=true registry
docker push localhost:5000/myubuntu:5.0 # 推送到私库
curl -XGET http://localhost:5000/v2/_catalog # 查看私库有哪些镜像
docker pull localhost:5000/myubuntu:5.0 # 从私库下载

安装软件

mysql

docker run -d -p 3307:3306 --privileged=true -v /docker/mysql3307/log:/var/log/mysql -v /docker/mysql3307/data:/var/lib/mysql -v /docker/mysql3307/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=jrbjrb811 --name=mysql3307 mysql:8.0.39
# 只要挂载在宿主机的日志文件、数据文件、配置文件都在,容器删除再新建的话,数据依然在。

redis

vim /docker/redis/redis.conf
# 开启密码验证(可选)
requirepass 123
# 允许redis外地连接,需要注释掉绑定的IP
# bind 127.0.0.1
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
# 开启redis数据持久化, (可选)
appendonly yes

docker run -d -p 6380:6379 --name redis6380 --privileged=true -v /docker/redis6380/redis.conf:/etc/redis/redis.conf -v /docker/redis6380/data:/data redis:7.0.15 redis-server /etc/redis/redis.conf
# 只要挂载在宿主机的数据文件、配置文件都在,容器删除再新建的话,数据依然在。

Dockerfile

构建Docker镜像的文本文件。

vim Dockerfile

# 基础镜像
FROM ubuntu
# 作者邮箱
MAINTAINER JRB<abc@qq.com>
# run build时运行的命令
RUN echo "abc" > abc.txt
# 设置环境变量,通过$获取
ENV MYPATH /usr/local
# 登录时的工作目录
WORKDIR $MYPATH
# 将宿主机文件添加到容器的指定路径中,安装包要和Dockerfile文件在同一目录,如果是压缩文件会自动解压
ADD file.tar.gz /usr/local
# 拷贝宿主机文件或目录到容器中,文件和目录要和Dockerfile文件在同一目录
COPY d /usr/local
# 对外暴露的端口
EXPOSE 80 8080
# 有多个CMD命令时只有最后一个生效,docker run时运行
CMD echo "docker run时执行"

docker build -t defindubuntu:1.1 .

network

启动docker服务时,会创建一个docker0网桥,主机与容器通过该网桥互相通信,实现端口映射功能。
docker network有三种网络模式:bridge、host、none,默认为bridge模式,该模式下会为每一个容器分配ip,并连接到docker0

容器编排

如果要同时启动多个容器,并且容器之间存在启动顺序,可以使用集群容器编排实现。
compose适合单机部署多个容器,集群部署需要用K8S。

vim docker-compose.yml

version: "3"

services:
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'jrbjrb811'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    ports:
      - "3333:3306"
    volumes:
      - /app/mysql/db:/var/lib/mysql
      - /app/mysql/conf/my.cnf:/etc/my.cnf
      - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - my_network
    command: --default-authentication-plugin=mysql_native_password 
    depends_on:
      - redis
  redis:
    image: redis
    ports:
      - "6666:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks:
      - my_network
    command: redis-server /etc/redis/redis.conf

networks:
  my_network:

docker compose config -q # 在docker-compose.yml文件所在目录执行,对文件进行语法检查
docker compose up -d # 启动并执行docker-compose.yml文件

Docker监控图形化界面

Portainer

docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /docker/portainer/var/run/docker.sock:/var/run/docker.sock -v /docker/portainer/portainer_data:/data portainer/portainer-ce:2.13.0-alpine

通过ip:9000访问。

CIG

https://www.yuque.com/tmfl/cloud/ay9g1r

vim docker-compose.yml

version: '3.1'

volumes:
  grafana_data: {}

services:
  influxdb:
	# tutum/influxdb 相比influxdb多了web可视化视图。但是该镜像已被标记为已过时
    image: tutum/influxdb:0.9
    restart: always
    environment:
      - PRE_CREATE_DB=cadvisor
    ports:
      - "8083:8083"         # 数据库web可视化页面端口
      - "8086:8086"         # 数据库端口
    volumes:
      - ./data/influxdb:/data

  cadvisor:
    image: google/cadvisor:v0.32.0
    links:
      - influxdb:influxsrv
    command:
      - -storage_driver=influxdb
      - -storage_driver_db=cadvisor
      - -storage_driver_host=influxsrv:8086
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

  grafana:
    image: grafana/grafana:8.5.2
    user: '104'
    restart: always
    links:
      - influxdb:influxsrv
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - HTTP_USER=admin
      - HTTP_PASS=admin
      - INFLUXDB_HOST=influxsrv
      - INFLUXDB_PORT=8086
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐