docker容器
1.安装docker
官网:·https://docs.docker.com/engine/install/centos/
- 安装相关依赖:yum -y install gcc,yum -y install gcc-c++,yum install -y yum-utils
- 添加阿里云yum源库:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum源库:yum makecache fast
- 安装DOCKER CE:yum -y install docker-ce docker-ce-cli containerd.io
- 启动docker:systemctl stop firewalld(关闭防火墙),systemctl start docker
- 测试:docker -v
配置阿里云加速器时,配置后无法启动,需要在/etc/docker/daemon.json中加上“storage-driver”: “devicemapper”,
2.相关操作
【帮助启动类命令】
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
查看docker运行日志:journalctl -u docker.service
【镜像命令】
列出本地主机上的镜像:docker images
查看镜像库中的镜像:docker search 镜像名
下载镜像:docker pull 镜像名
查看镜像/容器/数据卷所占的空间:docker system df
删除镜像:docker rmi -f 镜像名
【容器命令】
新建+启动容器:·docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
–name=“容器新名字” 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
列出当前所有正在运行的容器:docker ps
退出容器:exit,run进去容器,exit退出,容器停止;ctrl+p+q,run进去容器,ctrl+p+q退出,容器不停止
启动已停止运行的容器:docker start 容器ID或者容器名
重启容器:docker restart 容器ID或者容器名
停止容器:docker stop 容器ID或者容器名
强制停止容器:docker kill 容器ID或容器名
删除已停止的容器:docker rm 容器ID
查看容器日志:docker logs 容器ID
进入容器中:·docker exec -it 容器ID /bin/bash
从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径
导出容器:·docker export 容器ID > 文件名.tar
导入容器为镜像:·cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
挂载卷启动:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
·查看数据卷是否挂载成功:docker inspect 容器ID
【网络配置】
查看网络:docker network ls
查看网络源数据:docker network inspect XXX网络名字
删除网络:docker network rm XXX网络名字
bridge模式:使用–network bridge指定,默认使用docker0
host模式:使用–network host指定
none模式:使用–network none指定
container模式:使用–network container:NAME或者容器ID指定
重设网桥:(docker0是默认网桥,在ping容器内部IP时发现网络不通)
- 关闭docker 服务 systemctl stop docker
- yum install bridge-utils,利用brctl show查看网桥
- 添加网桥 brctl addbr br0
- 添加ip范围段:ip addr add 172.16.0.1/24 dev br0
- 启用网桥 ip link set dev br0 up
- 常看br0 网桥信息 ifconfig br0
- 修改docker默认网桥 vim /etc/docker/daemon.json: “bridge”:“br0”,
- 启动docker服务, systemctl start docker, 查看网桥信息,br0已经生效
ifconfig docker0 down 关闭网桥
ifconfig docker0 up 开启网桥
docker+mysql
-
查看镜像库mysql镜像:docker search mysql
-
拉取mysql:5.7:docker pull mysql:5.7
-
启动mysql容器:docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 #包含挂载卷(配置,日志,数据)
-
进入容器中:docker exec -it 容器ID /bin/bash,登录:mysql -uroot -p
docker+redis
- 准备并修改配置文件:redis.conf
开启redis验证:requirepass 123(可选)
允许redis外地连接:注释掉 # bind 127.0.0.1
后台运行:daemonize yes
开启redis数据持久化: appendonly yes(可选) - 拉取镜像:docker pull redis:6.0.8
- 运行镜像:docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
- 进入容器登录:docker exec -it 容器ID redis-cli
dockerfile构建项目镜像
构建命令:
FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露出的端口
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定容器启动后的要干的事情,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
docker build -t 新镜像名字:TAG . //构建镜像,dockerfile和jar都在当前目录下
docker image prune //虚悬镜像已经失去存在价值,可以删除
参考dockerfile:
FROM java:8 # 基础镜像使用java
MAINTAINER zzyy # 作者
VOLUME /tmp # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar # 将jar包添加到容器中并更名为zzyy_docker.jar
RUN bash -c ‘touch /zzyy_docker.jar’
ENTRYPOINT [“java”,“-jar”,“/zzyy_docker.jar”] # 运行jar包
EXPOSE 6001 #暴露6001端口作为微服务
docker-compose容器编排
官网下载:https://docs.docker.com/compose/install/
安装:
- 下载:curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose- ( u n a m e − s ) − (uname -s)- (uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
- 赋权限:chmod +x /usr/local/bin/docker-compose
- 查看版本:docker-compose --version
卸载:rm /usr/local/bin/docker-compose
【编写docker-compose.yml】
参考:
version: “3”
services:
microService:
image: zzyy_docker:1.6
container_name: ms01
ports:
- “6001:6001”
volumes:
- /app/microService:/data
networks:
- atguigu_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- “6379:6379”
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- atguigu_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ‘123456’
MYSQL_ALLOW_EMPTY_PASSWORD: ‘no’
MYSQL_DATABASE: ‘db2021’
MYSQL_USER: ‘zzyy’
MYSQL_PASSWORD: ‘zzyy123’
ports:
- “3306:3306”
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
atguigu_net:
【常用命令】
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
docker可视化工具Portainer
官网:www.portainer.io/
安装:docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
登录:·第一次登录需创建admin,访问地址:xxx.xxx.xxx.xxx:9000
访问时出现Failure Got permission denied while trying to connect to the Docker daemon socket,解决如下:SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。
- 临时关闭(不用重启机器):
setenforce 0 ##设置SELinux 成为permissive模式 ,setenforce 1 设置SELinux 成为enforcing模式 - 修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可 或者sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/’ /etc/selinux/config