docker基础运用及镜像制作
docker安装机基础命令介绍
官方网址:https://www.docker.com/
系统版本选择: docker目前支持 多种操作系统的安装运行,如:Ubuntu centos,redhat,Debian,甚至还支持mac和windows,在Linux上,需要内核版本在3.10以上。docker以前的版本号都是以x.1, x.2 结尾,从2017年开始改为每个季度发布一次稳定版,其版本号也改成了YY.MM。
docker 安装
官方rpm包下载地址
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
二进制下载地址
https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/
docker-compose安装
项目仓库地址
https://github.com/docker/compose/tags
yum 安装docker
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CenOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
docker 基础命令
docker daemon -help 查看docker帮助文档
ocker info 查看docker 信息
docker search centos 搜索镜像
docker pull xxxx 拉取镜像
docker images 查看当前机器所有镜像
docker save centos > /usr/centos.tar.gz 镜像导出
docker commit -m "镜像描述" 容器ID tag #tag为容器标签 如 nginx:v1
docker cp /路径/文件名 容器ID:/上传路径 #从本地上传文件到容器
docker rmi centos 删除镜像
docker run -it centos:latest 从镜像启动一个容器,并进入容器(ctrl+p+q)退出容器,不注销
docker run -P 镜像ID #前台启动一个容器。并随机映射一个端口到容器内部
docker run -p 80:80 镜像ID # 前台启动一个容器,并将本机80端口映射到容器80端口
docker run -p 192.168.144.9:80:80 --name ninx 镜像ID # 前台启动一个容器,并将本地ip:端口映射到容器ID,自定义容器名称为nginx
docker run -p 192.168.144.9::80 --name ninx 镜像ID # 前台启动一个容器,并将本地ip:随机端口映射到容器ID
docker run -p 192.168.144.9:80:80/udp --name ninx 镜像ID # 前台启动一个容器,并将本地ip:udp端口映射到容器ID
docker run -p 80:80 -p 81:81 -p 82:82 --name ninx 镜像ID # 前台启动一个容器,映射多个端口到容器
docker run -d -p 80:80 --name ninx2 镜像ID # 后台启动一个容器
docker ps 查看正在运行的容器
docker ps -a 查看所有容器
docker rf -f ID 删除容器
docker logs -f #容器ID 查看容器实时日志
docker port 容器ID # 查看容器已经映射的端口
docker stop 容器ID # 停止容器
dockers start 容器ID # 启动容器
docker stop $(docker ps -a -q) #批量关闭正在运行的容器
docker kill $(docker ps -a -q) #批量强制关闭所有运行中的容器
docker rm -f `docker ps -aq -f status=exited` # 批量关闭所有已关闭的容器
docker 镜像制作
手动制作yum版nginx镜像
下载基础镜像并初始化系统
[root@localhost ~]# docker pull centos
启动并进入容器
[root@localhost ~]# docker run -it centos bash
配置容器环境
[root@d71fc0234652 /]# yum install wget -y
[root@d71fc0234652 /]# cd etc/yum.repos.d/
[root@d71fc0234652 yum.repos.d]# rm -rf ./*
[root@d71fc0234652 yum.repos.d]#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@d71fc0234652 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@d71fc0234652 yum.repos.d]# yum -y install pcre pere-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
安装nginx
[root@d71fc0234652 yum.repos.d]# yum -y install nginx
修改配置文件,使nginx前台启动
[root@d71fc0234652 yum.repos.d]# vim /etc/nginx/nginx.conf
daemon off;
在宿主机将容器提交为镜像
[root@localhost ~]# docker commit -m "nginx image" d71fc0234652 nginx:v1
从自己打的镜像启动容器
[root@localhost ~]# docker run -d -p 80:80 --name nginx nginx:v1 /usr/sbin/nginx
测试:我这里没有配置web页面,所以访问报错 可以看到已经访问到nginx了
DockerFile制作编译版NGINX
DockerFile 可以说是一种可以被docker程序解析的脚本,DockerFile是由一条条约定的命令组成的,每条命令对用linux下的一条命令,Docker 程序将这些DockerFile指令在翻译成正真的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指定生成Docker镜像,相比手动制作镜像的方式,DockerFile可以直观的展示镜像是怎么产生的。
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
RUN
下载初始化镜像
[root@localhost ~]# docker pull centos
创建DockerFile存放目录并进入此目录
[root@localhost ~]# mkdir -p /opt/dockerfile/nginx && cd /opt/dockerfile/nginx
编写DockerFile 生成镜像的时候会在执行命令的当前目录查早Dockerile文件,所以名称不能写错,D必须是大写
[root@localhost nginx]# vim Dockerfile
FROM bluedata/centos7:latest
MAINTAINER yaoxinyuan
RUN yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel \
&& useradd -r -s /sbin/nologin nginx \
&& yum clean all
ADD nginx-1.20.2.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.20.2 \
&& ./configure --prefix=/apps/nginx \
&& make \
&& make install \
&& rm -rf /usr/local/src/nginx*
#ADD nginx.conf /apps/nginx/conf/nginx.conf
#COPY index.html /apps/nginx/html/
RUN ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
执行镜像构建
[root@localhost nginx]# docker build -t nginx:v1 .
从镜像启动一个容器
[root@localhost nginx]# docker run -d -p 80:80 nginx:v7
查看启动的容器
[root@localhost nginx]# docker ps
构建jdk镜像
#
FROM bluedata/centos7:latest
ADD jdk-8u151-linux-x64.tar.gz /usr/local/src/
RUN ln -sv /usr/local/src/jdk1.8.0_151 /usr/local/jdk
ADD profile /etc/profile
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai/ /etc/localtime
执行构建
[root@localhost java]# docker build -t java:v3 .
查看构建的镜像
验证jdk镜像
[root@localhost java]# docker run -it java:v3 bash
[root@400254d0263c /]# java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
从jdk镜像构建tomcat镜像
FROM java:v3
ADD apache-tomcat-9.0.56.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-9.0.56 /usr/local/tomcat
构建镜像
查看构建的镜像
[root@localhost tomcat]# docker images
从tomcat 构建业务镜像
创建一个目录
[root@localhost app]# mkdir app1
[root@localhost app]# pwd
/opt/Dockerfile/app
准备Dockerfile
FROM tomcat:v2
ADD app1/index.html /usr/local/tomcat/webapps/app/
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
准备项目文件
构建镜像
[root@localhost app]# docker build -t app:v2 .
从镜像启动容器
[root@localhost app]# docker run -it -d -p 8083:8080 app:v2
swarm
1.初始化:
root@k8s-master1:~# docker swarm init --advertise-addr 192.168.144.3 #初始化manager
root@k8s-master1:~# docker swarm join-token worker #获取token
root@k8s-master1:~# docker node ls #列出swarm集群的节点
2.添加节点
root@k8s-master2:~# docker swarm join --token SWMTKN-1-5vmi21qrc9thymrs9lxsoaebt4j5o01ma8bhfbhasrxwkzo8ch-6zfq0l4mqjzbzt8m0vfm1zjur 172.31.7.101:2377
root@k8s-master3:~# docker swarm join --token SWMTKN-1-5vmi21qrc9thymrs9lxsoaebt4j5o01ma8bhfbhasrxwkzo8ch-6zfq0l4mqjzbzt8m0vfm1zjur 172.31.7.101:2377
3.添加label
root@k8s-master1:~# docker node update --label-add name=k8s-master1 主机名
k8s-master1.magedu.local.priview
root@k8s-master1:~# docker node update --label-add name=k8s-master2 主机名
k8s-master2.magedu.local.priview
root@k8s-master1:~# docker node update --label-add name=k8s-master3 主机名
k8s-master3.magedu.local.priview
4.将其他节点提升为manager角色以实现高可用:
root@k8s-master1:~# docker node promote k8s-master2.magedu.local.priview
Node k8s-master2.magedu.local.priview promoted to a manager in the swarm.
root@k8s-master1:~# docker node promote k8s-master3.magedu.local.priview
Node k8s-master3.magedu.local.priview promoted to a manager in the swarm.
root@k8s-master1:~#
root@k8s-master1:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
nikz1m7wn4go2k5fkr86lhole * k8s-master1.magedu.local.priview Ready Active Leader 19.03.14
xnloavs2yruuhpx060tmlf6w1 k8s-master2.magedu.local.priview Ready Active Reachable 19.03.14
e0t0mbjagphaqe87okvj11lyd k8s-master3.magedu.local.priview Ready Active Reachable 19.03.14
5.查看node信息:
root@k8s-master1:~# docker node inspect k8s-master2.local.priview
6.创建网络:
root@k8s-master1:~# docker network --help
root@k8s-master1:~# docker network create -d overlay --subnet=10.220.0.0/21 --gateway=10.220.0.1 --attachable yao-net
tzm6el34dt3k1juwoti618u9x
root@k8s-master1:~# docker network inspect yao-net #验证网络信息
7.创建容器测试
root@k8s-master1:/opt/docker-compose-test# docker service create --replicas 3 -p 8888:80 --network yao-net --name nginx nginx:latest
vw6fqt3jwtkazv5n8p76ivz9b
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
root@k8s-master1:/opt/docker-compose-test# docker service ls #验证service
ID NAME MODE REPLICAS IMAGE PORTS
vw6fqt3jwtka nginx replicated 2/2 nginx:1.18-alpine *:8888->80/tcp
root@k8s-master2:~# ss -tnl #验证端口监听,每个服务器都会监听service端口8888
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:6010 0.0.0.0:*
LISTEN 0 128 *:2377 *:*
LISTEN 0 128 *:7946 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 *:8888 *:*
LISTEN 0 128 [::1]:6010 [::]:*
8.访问测试:
root@k8s-master2:~# curl http://172.31.7.102:8888
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
9.验证service
root@k8s-master3:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vw6fqt3jwtka nginx replicated 2/2 nginx:1.18-alpine *:8888->80/tcp
root@k8s-master3:~# docker service ps vw6fqt3jwtka
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
bppmk2mak974 nginx.1 nginx:1.18-alpine k8s-master1.magedu.local.priview Running Running 5 minutes ago
9qbddx756jzc nginx.2 nginx:1.18-alpine k8s-master3.magedu.local.priview Running Running 5 minutes ago
10.验证高可用:
将容器所在的服务器或docker关闭,验证pod副本高可用
通过容器名称互联
启动第一个容器
[root@localhost java]# docker run -it -d --name java1 java:v1
进入第一个容器 查看hosts文件
docker exec -it aa8a9274e563 bash
启动第二个容器
使用--link 指令将第一个容器的hosts信息添加到第二个容器的hosts
docker run -it -d --name java3 --link java1:www.yaoxinyuan.com java:v1
进入容器测试
docker exec -it b232c20b8151cb22523fe6686872f848543ed0bd585a6df5d978581353ecf270 bash