Docker学习笔记

Docker学习笔记

1、docker的安装

  # 1.卸载旧的版本
  sudo yum remove docker \
                    docker-client \
                    docker-client-latest \
                    docker-common \
                    docker-latest \
                    docker-latest-logrotate \
                    docker-logrotate \
                    docker-engine
                   
  # 2.需要的安装包
  sudo yum install -y yum-utils
 
  # 3.设置镜像的仓库
  sudo yum-config-manager \
      --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo # 国外的,比较慢,不推荐用
   
   sudo yum-config-manager \
      --add-repo \
      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云镜像地址
     
  # 4.更新yum软件包索引
  yum makecache fast
 
  # 5.安装docker相关的 docker-ce:社区版 ee:企业版
  sudo yum install docker-ce docker-ce-cli containerd.io
 
  # 6.启动docker
  systemctl start docker
 
  # 7.运行 hello-world
  docker run hello-world
 
  # 8.查看镜像
  docker images

 

卸载docker

  # 1.卸载 Docker Engine、CLI 和 Containerd 包:
  sudo yum remove docker-ce docker-ce-cli containerd.io
 
  # 2.主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
  sudo rm -rf /var/lib/docker
  sudo rm -rf /var/lib/containerd

 

配置阿里云镜像加速

  1. 登录阿里云,产品 > 弹性计算 > 容器镜像服务

  2. 找到镜像加速器,找到配置,执行

      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
        "registry-mirrors": ["https://nmuw5bat.mirror.aliyuncs.com"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker

 

底层原理

docker是一个client-server的结构,docker的守护进程在主机上。通过docker在客户端访问。

DockerServer收到Docker-Client的命令,就会执行这个命令

 

 

2、Docker的常用命令

1、帮助命令

  # 帮助命令
  docker 命令 --help
 
  # 版本信息
  docker version
 
  # docker系统信息,包括镜像和容器的数量
  docker info
 
  # docker所有命令
  docker --help

 

2、镜像命令

  # 查看本地主机上的镜像
  docker images
 
  # 搜索镜像
  docker search 镜像名称
 
  # 下载镜像
  docker pull 镜像名[:tag]  # 不写tag,默认是latest,最后一个版本,也就是最新版本
 
  # 删除镜像
  docker rmi -f 镜像名或镜像id
 
  docker rmi -f $(docker images -aq) # 删除所有的镜像

 

3、容器命令

说明:我们有了镜像才可以创建容器,接下来我们下载一个centos镜像来测试学习

  docker pull centos

新建容器并启动

  docker run [可选参数] 镜像
 
  # 可选参数说明
  --name="Name"        # 启动容器的名字,用以区分
  -d                   # 后台运行方式 如nohup
  -it                  # 使用交互方式运行,进入容器查看内容
  -p                   # 指定容器的端口,如8080
       -p 主机端口:容器端口
       -p 容器端口
  —P                   # 随机指定端口
 
 
  # 测试,启动并进入容器
  [root@192 ~]# docker run -it centos /bin/bash
  [root@936be62b0405 /]#
 
  # 查看容器内的centos目录
  [root@936be62b0405 /]# ls
  bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
 
  # 退出并停止容器
  exit
 
  # 查看正在运行的容器
  docker ps       # 当前所有正在运行的容器
   -a             # 列出当前所有正在运行的容器 + 历史运行过的容器
   -n=?           # 显示最近创建的容器

 

退出容器

  # 退出并停止容器
  exit
  # 退出不停止容器
  Ctrl + P + Q

 

删除容器

 # 删除指定的容器 (不能删除正在运行的容器,要强制删除使用:docker rm -f )
 docker rm 容器id
 # 删除所有容器
 docker rm $(docker ps -qa)

 

启动和停止容器操作

 # 启动
 docker start 容器id
 # 重启
 docker restart 容器id
 # 停止
 docker stop 容器id
 # 杀掉
 docker kill 容器id

 

4、常用的其它命令

1、后台启动容器

 docker run -d 容器名

 

2、查看容器的日志

 docker logs -tf 容器id
  --tail number # 显示日志条数

 

3、查看容器中进程信息

 docker top 容器id

 

4、查看容器的元数据信息

 docker inspect 容器id

 

5、进入当前运行的容器

 # 方式一(常用:进入容器,开启一个新的终端,可以在里面操作)
 docker exec -it 容器id /bin/bash
 
 # 方式二(进入容器正在执行的终端,不会启动新的进程)
 docker attach 容器id

 

6、从容器内拷贝文件到主机上

 docker cp 容器id:容器内路径 目的主机路径

 

3、练习

1、docker安装nginx

 # 搜索nginx
 docker search nginx
 
 # 下载nginx镜像
 docker pull nginx
 
 # 查看镜像
 docker images
 
 # 启动容器
 docker run -d --name nginx01 -p 3344:80 nginx # 注意:-p:端口暴露
 
 
 # 查看运行的容器
 docker ps
 
 # 测试nginx是否能访问
 curl localhost:3344

 

2、docker启动tomcat

 # 下载并启动tomcat
 docker run -it --rm tomcat:9.0 # --rm : 容器用完即删(一般测试使用)
 
 docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0

 

3、docker查看内存的命令

 docker stats

 

 

问题:我们每次修改一些配置文件,都要进入容器内部修改,十分的麻烦。

要是能在容器外部提供一个映射路径,只在外部做修改就能同步到容器内部的配置就好了。

 

4、可视化

docker图形化管理界面,提供一个后台面板供我们操作

1、portainer(先用这个)

 # 安装启动
 docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

 

2、Rancher(CI/CD再用)

 

 

4、Docker容器、镜像迁移

  1. 保存本地文件,再加载

     # 提交镜像
     docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名[:tag]
     
     # 镜像保存为文件
     docker save -o "文件名".tar "镜像名":版本
     
     # 文件拷贝到目标机器,在目标机器加载镜像
     docker load -i "镜像文件名".tar
  1. 镜像推送远程仓库,要用就从远程仓库拉取

     # 打tag
     docker tag 目标镜像:版本 仓库名:版本
     
     # 推送
     docker push 仓库名:版本
     
     # 登录到docker hub
     docker login
     
     # 推送完以后,建议登出
     docker logout

     

5、容器数据卷

将应用和容器打包成一个镜像!

数据都在容器中,如果把容器删除,那么容器中的数据也没了,这时候我们需要数据持久化

容器有一个数据共享的技术!docker容器中产生的数据可以同步到本地!

这就是卷技术,容器内的目录挂在到我们本地linux的目录上

 

1、使用数据卷

方式一:直接使用命令命令来挂载:-v

 docker run -it -v 主机目录:容器目录 -p 主机ip:容器暴露ip 镜像
 
 # 例如:同步容器的tomcat的webapps目录同步数据
 docker run -d -p 8080:8080 --name tomcat01 -v /tmp/webapps:/usr/local/tomcat/webapps tomcat:9.0

好处:容器内的数据同步到本地

 

方式二:匿名挂载和具名挂载

 # 匿名挂载(顾名思义,就是没有名字的挂载)
 -v 容器路径
 
 # 具名挂载
 -v 卷名字:容器路径

 

注意:多有docker容器的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

 

卷的相关命令

 # 查看所有卷
 docker volume ls
 
 # 查看具体卷的信息
 docker volume inspect 卷名

 

拓展

 # 通过 -v 容器内路径:ro 或 -v 容器内路径:rw 来改变读写权限
 ro read only
 rw read write

 

2、初识DockerFile

DockerFile 就是用来构建docker镜像的构建文件!命令脚本,通过这个脚本可以生成镜像。

 # 脚本内容
 FROM centos
 
 VOLUME ["volume01","volume02"]
 CMD echo "----end----"
 CMD /bin/bash
 
 # 运行脚本,生成镜像
 docker build -f 脚本文件 -t 生成的镜像名 生成的路径

 

容器与容器间的数据同步

 # 启动容器时使用 --volumes-from 参数,例如:
 docker run -it --name 容器名称 --volumes-from 父容器名称 镜像

 

 

6、DockerFile

1、构建过程

基础知识:

  1. 每个保留关键字(命令)都必须是大写字母

  2. 从上到下的执行顺序

  3. #表示注释

  4. 每个命令都会创建和提交一层镜像层

 

 FROM                # 基础镜像,一切从这里开始
 MAINTAINER # 镜像是谁写的,(姓名 + 邮箱)
 RUN # 镜像构建的时候需要运行的命令
 ADD # 添加内容
 WORKDIR # 镜像的工作目录
 VOLUME # 挂载的目录
 EXPOSE # 暴露端口
 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
 ONBUILD # 当构建一个被继承的DockerFile,这个时候就会运行ONBUILD的指令
 COPY # 类似ADD命令,将我们的文件拷贝到镜像中
 ENV # 构建的时候设置环境变量

 

2、构建一个自己的centos

  1. 编写DockerFile文件test-dockerfile

     FROM centos
     MAINTAINER zhouq<568390181@qq.com>
     
     ENV MYPATH /usr/local
     WORKDIR $MYPATH
     
     RUN yum -y install vim
     RUN yum -y install net-tools
     
     EXPOSE 80
     
     CMD echo $MYPATH
     CMD echo "----end----"
     CMD /bin/bash
  2. 构建

     docker build -f test-dockerfile -t mycentos:0.1 .

 

我们可以查看镜像的变更历史

 docker history 镜像id

 

3、实战:构建Tomcat镜像

  1. 准备镜像文件:tomcat压缩包,jdk压缩包

  2. 编写DockerFile文件,官方命名Dockerfile,build的时候可以不用-f指定文件,会自动寻找这个文件

     FROM centos
     MAINTAINER zhouq<568390181@qq.com>
     
     # 拷贝文件到指定目录
     COPY readme.txt /usr/local/readme.txt
     
     # 添加tomcat和jdk
     ADD apache-tomcat-9.0.52.tar.gz /usr/local
     ADD jdk-8u161-linux-x64.tar.gz /usr/local
     
     # 下载vim命令
     RUN yum -y install vim
     
     # 指定工作目录
     ENV MYPATH /usr/local
     WORKDIR $MYPATH
     
     # 配置java环境变量
     ENV JAVA_HOME /usr/local/jdk1.8.0_161
     ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
     
     # 配置tomcat环境变量
     ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.52
     ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.52
     ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
     
     # 暴露端口
     EXPOSE 8080
     
     # 通过命令启动tomcat
     CMD /usr/local/apache-tomcat-9.0.52/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.52/bin/logs/catalina.out
  3. 构建镜像

     docker build -t mytomcat:1.0 .
  4. 启动镜像

 

4、发布镜像

  1. 地址:https://hub.docker.com,注册自己的账号

  2. 命令登录docker hub

     # 登录
     docker login -u 用户名
     # 然后输入密码
  3. push命令提交

     docker push 镜像[:tag]
     
     # 如果提交出现错误,可以把镜像改个名字
     docker tag 镜像id 新镜像名[:tag]

 

5、配置阿里云镜像仓库

1. 登录阿里云Docker Registry

 $ docker login --username=快乐程序员2021 registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像

 $ docker pull registry.cn-hangzhou.aliyuncs.com/docker-zhouq/docker-test:[镜像版本号]

3. 将镜像推送到Registry

 $ docker login --username=快乐程序员2021 registry.cn-hangzhou.aliyuncs.com
 $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/docker-zhouq/docker-test:[镜像版本号]
 $ docker push registry.cn-hangzhou.aliyuncs.com/docker-zhouq/docker-test:[镜像版本号]

请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

4. 选择合适的镜像仓库地址

从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

5. 示例

使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。

 $ docker imagesREPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

使用 "docker push" 命令将该镜像推送至远程。

 $ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

 

 

 

7、Docker网络

问题:容器与容器之间网络是怎么通信的呢

我们每启动一个docker容器,docker都会为容器分配一个ip

 

1、--link

容器与容器间通过容器名连接通信

 # 例如:
 docker run -d -P --name tomcat02 --link tomcat01 tomcat

 

 

8、安装示例:

mysql

 docker run -p 33056:33056 \
 --name mysql \
 --mount type=bind,src=/mydata/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf \
 --mount type=bind,src=/mydata/mysql/data,dst=/var/lib/mysql \
 --mount type=bind,src=/mydata/mysql/logs,dst=/var/log \
 --mount type=bind,src=/mydata/mysql/mysql-files,dst=/var/lib/mysql-files \
 -e MYSQL_ROOT_PASSWORD=root123 \
 -d mysql:8.0.27

 

redis

 docker run -p 33465:33465 \
 --name redis \
 -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
 -v /mydata/redis/data:/data \
 -d redis redis-server /etc/redis/redis.conf

 

redis.conf

 save 900 1
 save 300 10
 save 60 1000
 
 port 33465
 
 daemonize yes

 

naocs集群

 docker run -d \
 -e NACOS_SERVERS=ip1:端口,ip2:端口 \
 -e NACOS_SERVER_IP=访问ip \
 -p 28848:28848 \
 -v /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties \
 -v /mydata/nacos/logs/:/home/nacos/logs/ \
 --name nacos \
 nacos/nacos-server:2.0.3

 

Elasticsearch

 docker run --name elasticsearch -p 9200:9200 \
 -p 9300:9300 \
 -e "discovery.type=single-node" \
 -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
 -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
 -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
 -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
 -d elasticsearch:7.8.0

Elasticsearch集群

  version: '3.6'
  services:
    es1:
      image: elasticsearch:7.8.0
      container_name: es1
      restart: always
      environment:
        - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      volumes:
        - /mydata/elasticsearch/config/es1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
        - /mydata/elasticsearch/data/es1:/usr/share/elasticsearch/data
        - /mydata/elasticsearch/logs/es1:/usr/share/elasticsearch/logs
        - /mydata/elasticsearch/plugins/es1:/usr/share/elasticsearch/plugins
      ports:
        - 9201:9201
        - 9301:9301
      networks:
        - elastic
    es2:
      image: elasticsearch:7.8.0
      container_name: es2
      environment:
        - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      restart: always
      volumes:
        - /mydata/elasticsearch/config/es2/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
        - /mydata/elasticsearch/data/es2:/usr/share/elasticsearch/data
        - /mydata/elasticsearch/logs/es2:/usr/share/elasticsearch/logs
        - /mydata/elasticsearch/plugins/es2:/usr/share/elasticsearch/plugins
      ports:
        - 9202:9202
        - 9302:9302
      depends_on:
        - es1
      networks:
        - elastic
    es3:
      image: elasticsearch:7.8.0
      container_name: es3
      restart: always
      environment:
        - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      volumes:
        - /mydata/elasticsearch/config/es3/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
        - /mydata/elasticsearch/data/es3:/usr/share/elasticsearch/data
        - /mydata/elasticsearch/logs/es3:/usr/share/elasticsearch/logs
        - /mydata/elasticsearch/plugins/es3:/usr/share/elasticsearch/plugins
      ports:
        - 9203:9203
        - 9303:9303
      depends_on:
        - es1
      networks:
        - elastic
    kibana:
      image: kibana:7.8.0
      container_name: kibana
      environment:
        ELASTICSEARCH_HOSTS: '["http://1.117.226.189:9201","http://1.117.226.189:9202","http://1.117.226.189:9203"]'
      ports:
        - 5601:5601
      networks:
        - elastic
      depends_on:
        - es1
 
 
  networks:
    elastic:

 

Nginx

 docker run -p 80:80 --name nginx \
 -v /mydata/nginx/html:/usr/share/nginx/html \
 -v /mydata/nginx/logs:/var/logs/nginx \
 -v /mydata/nginx/conf:/etc/nginx \
 -d nginx:stable

 

Kibana

 docker run --name kibana \
 -e ELASTICSEARCH_HOSTS=http://127.0.0.1:9200 \
 -p 5601:5601 \
 -d kibana:7.8.0

 

RabbitMq

 docker run -d  \
 --name rabbitmq \
 -p 5671:5671 \
 -p 5672:5672 \
 -p 4369:4369 \
 -p 25672:25672 \
 -p 15671:15671 \
 -p 15672:15672 \
 -e RABBITMQ_DEFAULT_USER=admin \
 -e RABBITMQ_DEFAULT_PASS=admin \
 rabbitmq:3.10.0-rc.3-management

 

idea docker插件配置

 <build>
 <plugins>
 <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>${docker.version}</version>
            <configuration>
                <!-- Docker 远程管理地址-->
                <dockerHost>http://ip地址:2375</dockerHost>
                <!-- Docker 推送镜像仓库地址-->
                <pushRegistry>http://ip地址:5000</pushRegistry>
                <!--是否推送镜像-->
                <pushImage>true</pushImage>
                <!--推送后是否覆盖已存在的标签镜像-->
                <forceTags>true</forceTags>
                <!--镜像名称-->
                <imageName>${project.artifactId}:${project.version}</imageName>
                <!--Dockerfile-->
                <dockerDirectory>${project.basedir}/docker</dockerDirectory>
 
                <!--插件会将需要的资源拷贝到 docker目录下,供Dockerfile里构建镜像使用-->
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
 </build>
posted @   有梦想的程序员。  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示