Docker01

Docker01-基础

1.Docker下载和安装

  1. https://www.docker.com/,Docker官网;https://docs.docker.com/,Docker文档地址;https://hub.docker.com/;Docker镜像仓库地址;https://docs.docker.com/engine/reference/run/,docker命令的官方地址。
  2. Docker的安装。
uname -r # 查看系统内核版本
cat /etc/os-release  # 查看系统信息

yum update # 更新yum软件包,不更新会报错。

# 删除旧的软件包
yum remove docker docker-client docker-client-latest \
docker-common docker-latest docker-latest-logrotate \
docker-logrotate docker-engine

yum install -y yum-utils # 安装需要的软件包

# 配置docker仓库地址
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

# 国内可以使用阿里云地址
yum-config-manager \
--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新为最新的软件包
yum makecache fast

# 安装docker;docker-ce-cli,Docker客户端;
# docker-ce,Docker服务端,ce 社区版;ee 企业版。
yum install docker-ce docker-ce-cli containerd.io

# 查看Docker状态
systemctl status docker 
  1. Docker的卸载
# 卸载Docker软件包
yum remove docker-ce docker-ce-cli containerd.io

# 删除Docker的 Images, containers, volumes数据
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
  1. 配置镜像加速
sudo mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF' 
{ 
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF 

sudo systemctl daemon-reload
sudo systemctl restart docker

2.Docker操作命令合集图

image

3.Docker命令-常用命令

docker version # 查看docker的版本信息

docker info # 显示docker系统信息,镜像、容器数

# docker命令的帮助,https://docs.docker.com/engine/reference/run/,docker命令的官方地址
docker --help

4.Docker命令-镜像命令

docker images --help # 查看docker镜像命令的帮助信息

docker images # 显示所有镜像
docker images -a # 显示所有镜像,包含隐藏的镜像
	
docker images -f "dangling=true" # 显示没有打标签的镜像。
docker images hello-world:latest # 通过标签搜索

docker images -q # 只显示镜像id,在批量操作镜像时有用
	
docker search mysql # 镜像搜索
docker search mysql -f stars=3000 # 带条件的搜索,搜索stars超过3000的
	
docker pull mysql # 拉取镜像
docker pull mysql:5.7 # 拉取指定版本的镜像

docker rmi -f 镜像id1 镜像id2 # 批量删除镜像
docker rmi -f feb5d9fea6a5
	
docker rmi -f $(docker images -aq) # 删除所有镜像 将$(docker images -aq)的输出,作为docker rmi -f的参数。
docker rmi -f $(docker images -q hello-world:latest)

5.Docker命令-容器命令

# -it 运行容器,并进入容器内
# 5d0da3dc9764 要运行容器的id
docker run -it 5d0da3dc9764 /bin/bash

# 后台运行容器。需要注意,-d 后台运行时,必须有一个对应的前台进程,否则,后台运行后会立刻退出。
docker run -d centos 

# 后台运行容器,如果当前容器是tomcat,/bin/bash会输出tomcat的启动日志。
docker run -d 5d0da3dc9764 /bin/bash
docker run -it --rm tomcat # 容器使用完成,自动删除,常用来测试

exit # 退出容器,退出后容器停止运行
Ctrl + P + Q # 退出容器,退出后容器不停止

docker ps # 显示正在运行的容器
docker ps -a # 显示正在运行和运行过的所有的容器
docker ps -aq # -q 只显示容器id
docker ps -aq -n=1 # -n=1,只显示一个

docker rm 439f5899da01 # 删除容器,不能删除正在运行的容器
docker rm -f 439f5899da01 # -f 强制删除,可以删除正在运行的容器。
docker rm -f $(docker ps -aq) # 批量删除
docker ps -a -q | xargs docker rm # 批量删除

docker start ec5647c51f13 # 启动容器
docker stop ec5647c51f13 # 停止容器
docker restart ec5647c51f13 # 重启容器

docker kill ec5647c51f13 # 强制停止容器

# -c 追加命令。追加的命令为每1秒钟,向容器输出hello-world
docker run -d centos /bin/sh -c 'while true;do echo hello-world;sleep 1;done'

# 容器日志查看。 -f 输出日志;-t 输出时间戳;
# --tail 10,显示最后的10行日志,不加会显示所有的日志
docker logs -tf --tail 10 4d347984fe97

docker top 4d347984fe97 # 查看容器内的进程信息
	
docker inspect 4d347984fe97 # 查看容器的数据信息

# 进入容器内部,并打开一个新的终端
docker exec -it 4d347984fe97 /bin/bash 
docker attach 4d347984fe97 # 进入容器内部,不会打开新的终端,而是会使用容器输出日志的窗口

# 将容器中的文件,拷贝到容器外部。将容器4d347984fe97的/home/my.txt文件拷贝到当前目录下
docker cp 4d347984fe97:/home/my.txt ./

6.Docker容器部署实战-Nginx

docker pull nginx # 拉取镜像

# 运行容器。-p,进行端口映射。
docker run -d --name mynginx01 -p 8080:80 nginx

docker exec -it 5e761caa8c8c /bin/bash # 进入容器

whereis nginx # Docker内执行,可以查看nginx路径
	
curl localhost:8080 # 验证是否启动成功

# 需要有nginx.conf文件
docker run -d --name nginx8088 -p 8088:80 \
-v /home/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/data/nginx/html:/usr/share/nginx/html \
-v /home/data/nginx/logs:/var/log/nginx nginx

7.Docker容器部署实战-Tomcat

docker pull tomcat
	
docker run -d --name mytomcat01 -p 8081:8080 tomcat
	
cp -r  webapps.dist/* webapps/ # 默认tomcat的webapps目录中没有文件,需要将webapps.dist中的项目拷贝过去
	
docker run -it --rm tomcat # 容器使用完成,自动删除,常用来测试
	
curl localhost:8081 验证是否启动成功

8.Docker容器部署实战-ElasticSearch

docker pull elasticsearch # 拉取镜像

# ElasticSearch需要大量的内存
# -e "discovery.type=single-node" 单机模式启动
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
	
# 通过-e来制定elasticsearch限制运行参数
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx124m" elasticsearch:7.6.2
	
docker stats -a # 查看docker中部署容器的cpu、内存状态
docker stats 719c343c18c5 # 查看指定的容器的cpu、内存状态

9.Docker容器部署实战-图像化管理界面

# 安装portainer,用来管理docker中启动容器的图形化界面
# --privileged=true,设置权限
# 登录的用户名和密码。admin 12345678
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

10.Docker命令-其他命令

docker stats -a # 查看docker中部署容器的cpu、内存状态
docker stats 719c343c18c5 # 查看指定的容器的cpu、内存状态

# 通过容器构建镜像
docker commit -a='wwt' -m='add web projcet' 719c343c18c5 mytomcat:1.0

docker volume ls # 查询容器目录挂在的所有数据
docker volume inspect mynginx # 查看mynginx具体挂载到宿主机的位置

docker history mysql:5.7 # 查看mysql:5.7镜像时如何构建的

# 登录,用于push镜像。
docker login -u wwt 回车输入密码
	
# push镜像,作者名/镜像名:标签
docker push tom/mytomcat:1.0

# 修改镜像名称
# centos01:1.0 修改之前的镜像名,也可以是镜像id
# mycentos:1.0 修改之后的镜像名
docker tag centos01:1.0 mycentos:1.0

docker save 580c0e4e98b0 -o /home/testsave.tar # 镜像压缩
docker load -i testsave.tar # 镜像解压

docker network ls # 查看docker网络
docker network inspect 5eb6b938b2c0 # 查看某个具体的网络的配置信息

11.Docker镜像的构建过程

  1. docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS,联合文件系统。主要特点是分层构建,共享底层的软件。
  2. docker镜像包含bootfs和rootfs。bootfs(boot file system)主要包含bootloader和kernel;rootfs (root file system) ,在bootfs之上。
  3. docker的镜像会使用宿主机的bootfs,所以镜像比较小。
  4. Docker镜像是只读的,当容器启动时,一个新的可写层会被加载到镜像的顶部。

12.Docker容器部署实战-Mysql

# 挂在出配置文件,数据目录
docker run -d -p 8080:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# 挂在出配置文件,日志目录和数据目录
docker run -p 33066:3306 --name mysql57 -v /home/data/mysql57/conf:/etc/mysql/conf.d -v /home/data/mysql57/logs:/logs -v /home/data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

13.Docker目录挂在-匿名挂载和具名挂载

# 匿名挂载
# -P 随机指定端口
# -v 容器内路径。随机制定挂载到本地的路径
docker run -d -P -v /etc/nginx nginx

# 具名挂载
docker run -d -P -v mynginx:/etc/nginx --name nginx02  nginx
# 查看挂载的目录
docker volume ls
DRIVER    VOLUME NAME
local     mynginx # 具名挂在为制定的名称mynginx;匿名挂在为随机的字符和数字

docker volume ls # 查询容器目录挂在的所有数据
docker volume inspect mynginx # 查看mynginx具体挂载到宿主机的位置,mynginx为挂在的卷名,即docker volume ls的查询结果

# 目录挂在并设置权限
# ro 只读
# rw 读写
docker run -d -P -v mynginx:/etc/nginx:ro --name nginx02  nginx
docker run -d -P -v mynginx:/etc/nginx:rw --name nginx02  nginx

14.Dockerfile构建镜像

  1. Dockerfile
FROM centos
volume ["volume01","volume02"] # 构建镜像时就将 /volume01 和 /volume02挂载出去

CMD echo '=====end====='
# 执行 /bin/bash命令 通过docker run -it mycentos01:1.0,启动容器时,并进入容器时,可以不指定 /bin/bash
CMD /bin/bash 
  1. build构建镜像
# -f 指定dockerfile文件
# -t mycentos01:1.0 指定镜像的名称和标签
# . 表示当前目录,必须有
docker build -f /home/dockerfile/dockerfile01 -t mycentos01:1.0 .
  1. Dockerfile构建centos镜像
FROM centos

# auth 作者信息
MAINTAINER tom<12@12.com>

ENV MYPATH /usr/local
# 进入容器后的目录为 /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

# 构建镜像
docker build -f /home/dockerfile/mycentos01 -t centos01:1.0 .
  1. Dockerfile构建tomcat镜像
FROM centos

MAINTAINER tom<12@12.com>

# 文件复制,copy,复制不解压文件,add 复制并解压文件
COPY dockerfile01 /usr/local/dockerfile01 
ADD jdk-8u212-linux-x64.tar.gz /usr/local/  
ADD apache-tomcat-8.5.72.tar.gz /usr/local/

CMD yum -y install vim

ENV MYPATH /usr/local/
WORKDIR $MYPATH

# Java环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_212
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# tomcat环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.72
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.72
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 启动tomcat,并输出实时的日志。
CMD /usr/local/apache-tomcat-8.5.72/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.72/logs/catalina.out

# 官方指定的dockerfile命名,如果命名为Dockerfile,build构建时,可以不加 -f参数,直接在当前目录下寻找Dockerfile
# . 表示当前目录,即add和copy的文件要在当前目录下
# 构建镜像
docker build -f /home/dockerfile/Dockerfile -t mytomcat .

# 启动时出现 cannot open directory .: Permission denied,
# 就在启动命令上加 --privileged=true
docker run -d -p 9090:8080 -v /tomcat/test:/usr/local/apache-tomcat-8.5.72/webapps/test -v /tomcat/tomcat9logs/:/usr/local/apache-tomcat-8.5.72/logs --privileged=true mytomcat

15.Docker数据卷技术,容器之间数据共享

docker run -it --name docker01 mycentos01:1.0
	
# --volumes-from=docker01和docker01容器共享挂载的/volume01 和 /volume02数据,即数据卷技术。docker01为14.1通过Dockerfile创建的容器
docker run -it --volumes-from=docker01 --name docker02 mycentos01:1.0 

# --volumes-from=docker01可以连续挂在,只要有一个容器存在,挂在的数据就不会丢失

14.Dockerfile中cmd和entrypoint

# CMD
FROM centos
CMD ["ls","-a"]
CMD echo '----- cmd -----'

# docker build -f dockerfile-cmd -t dockerfile-cmd .,构建镜像。
# docker run db8400604179,运行会执行最后一个CMD命令,即输出----- cmd -----
# 如果执行的是docker run db8400604179 ls -a,将最后一个CMD命令覆盖,输出ls -a查看的目录

# entrypoint
FROM centos
ENTRYPOINT echo '----- cmd -----'
ENTRYPOINT ["ls","-a"]

# docker run d77fbb4385f8,输入ls -a查看的目录。
# docker run d77fbb4385f8 -l,输出ls -a -l的返回值。即entrypoint会将执行的命令追加。

15.Docker网络

  1. --link容器网络连接。
docker run -it --name centos03 --link centos02 centos # 让centos03和centos02建立关系
docker exec -it centos03 ping centos02 # centos03就可以使用centos02的名称来进行访问。

# 本质是在centos03的hosts中增加了 DNS解析
docker exec -it centos03 cat /etc/hosts
172.17.0.2	centos02 9beda0ea8507
  1. docker常见的三种网络模式。
docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5eb6b938b2c0   bridge    bridge    local # 桥接
4dca7c6f58ee   host      host      local # host,和宿主机共享网络
17b110e09aac   none      null      local # none,不配置网络
  1. docker自定义网络
docker run -it --name centos01 centos # docker启动容器时,会自动添加网络的参数--net bridge,--net bridge就是docker默认的网络docker0,使用桥接模式,不支持通过容器名访问

# 创建自定义网络
# --driver bridge # 网络默认,默认桥接
# --subnet 192.168.0.0/16 # 子网掩码
# --gateway 192.168.0.1 # 网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

docker run -it --name centos-01 --net mynet centos # 创建容器是指定网络
docker exec -it centos-01 ping centos-02 # 不需要--link,可以通过容器名方法
  1. 网络隔离,15.3的网络模式会有一个问题,网络myredis和mytomcat不在同一个网段,所有彼此网段中容器不能通过容器名访问。
# 将centos01加入到mynet这个网络中,centos01就可以通过容器名访问centos-01了。
docker network connect mynet centos01

docker network inspect mynet # 查看mynet网络,发现将centos01加入到这个网络了
# centos01现在有两个ip地址。mynet下的 192.168.0.5/16和bridge下的172.17.0.2/16即一个容器,两个ip。

16.Docker搭建Redis分片集群

  1. 创建网络
docker network create redis --subnet 172.38.0.0/16
  1. 创建redis配置文件
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
  1. 脚本启动容器
# --ip 172.38.0.1${port},固定ip,如果不固定ip,docker会自动进行分配。
# redis-server /etc/redis/redis.conf # 启动redis服务,通过/etc/redis/redis.conf配置文件启动

for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
  1. 构建Redis集群
docker exec -it redis-1 /bin/sh # 进入redis容器内

# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 \
172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

redis-cli -c # 通过redis-cli指定-c参数连接到集群

cluster info # 查看集群信息
cluster nodes # 查看集群节点信息

17.将Springboot微服务构建为Docker镜像

  1. Dockerfile文件
# dockerfile文件
FROM java:8

COPY *.jar /app.jar

# 允许运行时通过命令指定端口
CMD ["--server.port=8080"]

# 要暴露的端口
EXPOSE 8080
# 启动jar包
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 构建镜像和启动容器
# 通过dockerfile文件创建镜像,jar包和Dockerfile文件在一起,都在当前目录
docker build -t myjar:1.0 .

# 启动容器
docker run -d --name my-web01 -p 8080:8080 myjar:1.0

# 运行,并输出启动日志
docker run -it --name my-web01 -p 8080:8080 myjar:1.0 /bin/bash
posted @ 2021-12-18 20:38  行稳致远方  阅读(52)  评论(0)    收藏  举报