docker 容器从0到1

1.什么是docker,有什么作用

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

2.docker的基本使用命令

2.1 docker 的安装和卸载

 先卸载

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

 安装工具

yum install -y yum-utils

设置阿里镜像路径,官方的比较慢 

sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 安装最新版Docker Engine-Community

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

2.2 centos 使用docker的命令

#### centos启动docker

systemctl start docker

#### 查看docker状态

systemctl status docker

#### 停止docker

systemctl stop docekr


2.3docker的镜像命令

#### 查看docker的镜像文件列表

docker images


#### 删除docker的镜像文件

docker rmi 镜像名字 docker rmi mysql 

docker rmi -f 镜像名字  #(强制删除) docker rmi -f mysql


##### 	查看某个镜像文件的在仓库里的stars大于30的镜像

docker search -f stars=30 mysql


##### 	去https://hub.docker.com/官方镜像仓库搜索镜像,tag里找到想要的然后拉取

docker pull mysql:5.7.39

2.4docker 容器的命令使用

# docker 运行 mysql -v是挂载 -d 是以后台方式运行 - e设置 mysql root用户和密码 -p是端口映射
docker run --name dockerMysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v   /root/data: /var/lib/mysql mysql:5.7.39


docker ps # 查看容器运行情况

docker exec -it dockerMysql bash # 进入mysql内部

docker exec -it  (name or id)  /bin/bash # 进入容器内部

docker start dockerMysql #启动容器

docker stop dockerMysql # 关闭容器

docker restart dockerMysql # 重启容器

docker rm -f dockerMysql # 强制删除容器

可能会出现的情况:: listen tcp4 0.0.0.0:3306: bind: address already in use.(端口被占用)

 ps -ef|grep 3306 # 查看端口或者 lsof -i:3306
 kill -9 pid 

 运行centos7容器

 docker run --name mycentos -itd centos:centos7
 docker exec -it mycentos /bin/bash #进入centos内部

2.5docker的文件 挂载

 所谓挂载相当宿主机和容器 挂载目录中的文件保持一样,如果容器突然被删除,宿主机里的文件不会消失。

# 将宿主机的文件拷贝到容器内

docker cp /nikaboy/a.txt mycentos:/nikaboy/ #注意:后面不能有空格

# 将容器里文件拷贝到宿主机

docker cp f5dec224a59d:/usr/nikaboy/a.txt /nikaboy #注意:后面不能有空格
# 将宿主机/nikaboy目录挂载到centos中的/nikaboy
docker run -di -v /nikaboy:/nikaboy --name=nikaboyVolume centos:centos7

 匿名挂载

# 匿名挂载的话就是没有写容器外对应的路径,只写容器内路径

docker run -di -v /nikaboy --name=nikaboy centos:centos7 #匿名挂载

docker volume ls # 查看匿名挂载随机生成的卷名

## 73fd7ef66970fd477e37292a0d9eb2282cc9bc4b47ae406e12db02cd32d8306b

docker inspect nikaboy ## 检查容器

 docker 容器从0到1_第1张图片

3.docker 镜像的制作

制作镜像有两种方式,1.使用docker commit制作自己镜像文件,2.dockerFile的方式制作

3.1 docker commit制作镜像

 docker run -di --name imagesTomcat -p 8080:8080 tomcat:latest  #以tomcat为基础容器
 
docker cp english.war imagesTomcat:/usr/local/tomcat/webapps/ #将一个准备好的jar包文件放入tomact的webapps中

docker ps # 查看基础容器tomcat的容器id 09cae84b2413

docker commit  -a "nikaboy" -m "我的镜像文件" 09cae84b2413 myimagestomcat:latest #提交容器为镜像

docker images # 查看镜像 

3.2dockerFile文件生成镜像

3.2.1.dockerFile制作的基本命令

FROM  #基础镜像 从这里开始

MIANTAINER # 镜像是谁写的

RUN #镜像构建的时候需要运行的指令

ADD #添加内容 类似Copy 使用方法: 添加的内容 目录

WORKDIR # 镜像的工作目录 不指定就是 root 下

EXPOSE #暴露的端口

CMD  #指定这个容器启动的时候要运行的命令 只有最后一个会生效

ENTRYPOINT #指定这个容器启动时候运行的命令 可以追加

COPY #类似ADD 将我们文件拷贝到镜像中

ENV #设置环境变量

3.2.2. dockerFile制作例子

vim mydockerfile-centos # 创建dockerfile-centos文件

##########################################################
FROM centos
	#基础镜像为FROM
MAINTAINER nikaboy<[email protected]>
	#设置作者
ENV MYPATH /usr/local
	 #设置路径
WORKDIR $MYPATH
	#设置该路径为工作目录
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum clean all
RUN yum makecache
RUN yum install wget -y
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN yum -y install vim
	#运行指令 添加vim
RUN yum -y install net-tools
	#运行添加网络工具
EXPOSE 80
	#暴露80端口
CMD echo $MYPATH

##########################################################
docker build -f mydockerfile-centos -t mycentos:0.1 . #运行dockerFile文件,如果是DockerFile文件就不用 使用 -f  

vim的基本使用回忆:

  • ESC :q 不编辑直接推退出

  • ESC :q! 编辑内容不保存退出

  • ESC :wq 保存并强制退出

可能遇到的问题:CentOS 8 将于年底终止! 在使用yum源安装时候会报错,请查看底部相关链接第三个,更新yum源为阿里镜像。

3.2.3带有tomcat和jdk的centos例子

FROM centos #
MAINTAINER nikaboy<[email protected]>
COPY README /usr/local/README #复制文件
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压
RUN yum -y install vim
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:
EXPOSE 8080 #设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 设置默认命令 启动tomcat同时输出日志文件

3.2.4 springboot项目的dockerFile文件,网关例子

# 基础镜像
FROM  openjdk:8-jre
# author
MAINTAINER nikaboy

# 挂载目录
VOLUME /home/nikaboy
# 创建目录
RUN mkdir -p /home/nikaboy
# 指定路径
WORKDIR /home/nikaboy
# 复制jar文件到路径
COPY ./jar/nikaboy-gateway.jar /home/nikaboy/nikaboy-gateway.jar
# 启动网关服务
ENTRYPOINT ["java","-jar","nikaboy-gateway.jar"]

5.docker的网络(构建一个独立的内网)

docker network create --subnet=192.168.100.0/24 mynetwork #创建自己的网络做网络隔离 ip不会随着容器启动而变化

docker run -itd --name=mycentos3 --net mynetwork --ip 192.168.100.111 centos:centos7 #启动容器的时候设置网络

brctl show #查看容器连接网络情况

yum -y install initscripts # centos7 ip addr无法查看网络则需使用该命令安装

6.什么是Docker Compose

Docker Compose就是通过yml的方式去配置运行多个容器,方便容器的管理。

6.1 使用Docker Compose

version: "3.0" # docker-compose模板的版本
services: # 服务,下面定义一组容器
  tomcat: # 具体的服务名
    container_name: tomcat-compose
    image: tomcat:latest # 依赖的镜像
    networks:
      extnetwork:
        ipv4_address: 192.132.0.123
    ports: # 对外暴露的端口
      - "8080:8080"
    volumes:
      - /niakboy/tomcat/webapps:/usr/local/tomcat/webapps/


networks:
  extnetwork:
    driver: bridge
    ipam:
      config:
        - subnet: "192.132.0.0/24"
          gateway: 192.132.0.1

 docker-compose up -d # 启动命令

6.2 较为完整的Docker Compose 参考

version: "3.0"
services:
  portainer: #Docker 可视化工具
    container_name: portainer
    image: portainer/portainer
    ports:
      - "8000:8000"
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      #- portainer_data/data portainer/portainer
    networks:
      - mynetwork
  tomcat:
    container_name: mytomcat
    image: tomcat:latest
    ports:
      - "8080:8080"
    volumes:
      - /niakboy/tomcat/webapps:/usr/local/tomcat/webapps
    networks:
      - mynetwork
  mysql:
    container_name: mysql_5.7
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - /niakboy/mysql:/var/lib/mysql
    networks:
      - mynetwork
    environment:
      - MYSQL_ROOT_PASSWORD=123456
  redis:
    container_name: redis_5.0.10
    image: redis:5.0.10
    ports:
      - "6379:6379"
    volumes:
      - /niakboy/redis:/data
    networks:
      - mynetwork
    command: "redis-server --appendonly yes" # 覆盖默认启动命令 开启redis数据持久化
networks:
  mynetwork:
    external:
      true

可能遇到的问题:

ERROR: Pool overlaps with other one on this address space

解决:原因是网段已经被占用,删除掉已有的自定义网络,或者换一个网段。

7. Docker Machine 是什么

Docker Machine 通过一台主机去管理其他主机创建多个主机容器,比如同时给100台服务器装上docker。

8.docker swarm的基本使用

8.1.docker swarm是什么

简单理解就是多台服务器搭建一个docker集群,每个服务器就是集群中的一个节点,当某个节点宕机或者中断,其上面的容器会被转移到其他节点上运行,保证程序可靠运行

8.2.docker swarm的使用命令

准备三台linux服务器,并且在三台服务器上安装docker
系统版本:CentOS 7
IP地址:192.168.10.10
主机名:manager

CentOS-docker-0313
系统版本:CentOS 7
IP地址:192.168.10.11
主机名:node0

CentOS-docker-0314
系统版本:CentOS 7
IP地址:192.168.10.12
主机名:node1
 

hostnamectl set-hostname manager # 192.168.10.10作为主服务机,修改名字微manager

hostnamectl set-hostname node0 # 192.168.10.11作为节点服务机,修改名字微node0 

hostnamectl set-hostname node1 #  192.168.10.12作为节点服务机,修改名字微node1 


docker swarm init --advertise-addr 192.168.10.10 # 在主节点上执行


### 会出现包含这样一串命令 docker swarm join --token SWMTKN-1-4zr8btdme2muomcoca7xosbj7tzgudfg6g85znyv9n454ol07w-3b7qc755wd7x8r9ibul3nvydu 192.168.10.10:2377 将该命令复制到两个节点服务机执行便可加入集群

docker info #查看docker信息

docker node ls #查看节点

docker node update --availability drain node0 # 下线node0

##在swarm中部署服务(以nginx为例)

docker network create -d overlay nginx_net #设置一个nginx的叠加网络

docker network ls | grep nginx_net #查看网络情况

docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx # 部署服务 replicas 1的意思是只生成一个容器实例

docker service ls # 查看容器实例

docker service update --replicas 3 my_nginx # 对实例进行扩容或者缩容,改变数字即可

docker swarm leave #节点离开集群 ,所有节点和manager都离开集群自动移除

swarm集群中node的availability状态可以为 active或者drain

active状态下,node可以接受来自manager节点的任务分派;

drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)

8.3.遇到的问题

docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx命令可能会很久,可以先下载好镜像,在执行该命令 

9.相关链接

Home - DockerLearn how Atomist will help Docker meet the challenge of securing secure software supply chains for development teams.https://www.docker.com/

Docker Hubhttps://hub.docker.com/

已启动的docker容器挂载新路径_chyf1990的博客-CSDN博客_docker 启动后挂载需求:docker运行的jenkins容器,想使用宿主机的maven。但是jenkins容器已经启动过了,再不打新的镜像的情况下使用以下方式修改配置文件,添加新的挂载路径。注意:必须先停止docker服务,否则改动不会生效。systemctl stop docker进入到要修改的容器路径(最后的那一长串是容器ID)cd /var/lib/docker/containers/93531fb93b4fe225251947ee4c9f1a4b72ab707a9bb45118dd464addhttps://blog.csdn.net/chyf1990/article/details/113621719

问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:..._一条小渣渣的博客-CSDN博客大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误“错误:Failed to download metadata for repo ‘AppStream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist”1、进入yum的repos目录2、修改所有的CentOS文件内容3、更新yum源为阿里镜像4、yum安装测试是否可以yum安装这个问题解决花了半个小时,越来越讨厌那些哔哔半天讲不到点上的https://blog.csdn.net/qq_575775600/article/details/125274121

Docker网络配置⚽ - 容器魔方Cube - 博客园Docker网络配置 文章作者: Escape 文章链接: https://www.escapelife.site/posts/ddc27dcd.html 纸上得来终觉浅,绝知此事https://www.cnblogs.com/haoee/p/16284925.html  Docker Compose详解_万wu皆可爱的博客-CSDN博客_docker-compse一、Docker Compose 简介Compose 项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。从功能上看,跟OpenStack 中的 Heat 十分类似。其代码目前在 https://github.com/docker/compose 上开源。Compose定位是【定义和运行多个Docker容器的应用(Oefining and running mult-container Docker applications)】,其前身是开源项目Fig。我们知道使用一个Dockehttps://blog.csdn.net/m0_46090675/article/details/121873943

 docker-machine_藕粉姜的博客-CSDN博客_docker machine容器集群的入门docker machine是docker官方编排(orchestration)项目之一,负责在多种平台上快速安装docker环境。docker machine支持在常规linux操作系统、虚拟化平台、openstack、公有云等不同环境下安装配置docker host.docker machine 项目基于go语言实现,目前在github上的维护地址:openstack偏向python,docker compose是用来做编排的,可以控制多容器。server1cd /usr/https://blog.csdn.net/weixin_46754666/article/details/124620077

DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结 - 程序猿小码 - 博客园前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了。大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的https://www.cnblogs.com/ChromeT/p/12302435.html#_label1走进docker-machine - 知乎什么是Docker-Machine? Docker Machine是一种工具,可让您在虚拟主机上安装Docker Engine,并使用docker-machine命令管理主机。简单来说就是给你快速创建一个docker容器环境的,如果你要给100台物理机安装上docke…https://zhuanlan.zhihu.com/p/358666246 docker-machine在阿里云部署批量部署docker - 走看看概述 docker入门中,docker swarm都是在本机的虚拟机上,为了更贴近生产环境,我将这部分重新部署到阿里云。不需要太贵,选最便宜的按量付费ECS,1小时才0.05元。 docker machttp://t.zoukankan.com/agichen-p-10433662.html
Docker Swarm_程涯的博客-CSDN博客_docker swarm1、什么是docker swarm ?Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm简单理解就是多台服务器搭建一个docker集群,每个服务器就是集群中的一个节点。参考:Docker三剑客之Docker Swarm - 一本正经的搞事情 - 博客园2、docker swarm的几个关键概念swarm :集群管理工具node :节点,一个节点就是dockerhttps://blog.csdn.net/Olivier0611/article/details/123447725

 https://www.jianshu.com/p/edf6cdb4baa7https://www.jianshu.com/p/edf6cdb4baa7

你可能感兴趣的:(java,docker,精品,docker,学习,运维)