目录
一、docker常用命令
二、 基于alpine基础镜像构建常见的系统服务, [nginx/jdk /tomcat]
三、将构建的镜像放在阿里云仓库。
四、 将构建的镜像,放在自建的harbor中,并且单独可以提供相应的服务
五、docker的常见网络模式
六、用docker-compose 将2中构建的镜像组合起来提供服务。
一、docker常用命令
1.1查看命令
命令 解释
docker ps 查看正在运行的容器
docker ps
docker ps -a 查看所有已经创建的容器
docker images 列出镜像列表
docker container ls 效果同ps命令(加-a效果同)
docker ps 详细参数
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
–format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
–no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
docker images 详细参数
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
–digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
–format :指定返回值的模板文件;
–no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
1.2删除命令
命令 解释
docker rm 删除容器
docker rmi 删除镜像
docker rm 详细参数
-f :强制删除一个运行中的容器
-l :移除容器间的网络连接,而非容器本身
-v :-v 删除与容器关联的卷
docker rmi 详细参数
-f :强制删除;
–no-prune :不移除该镜像的过程镜像,默认移除;
1.3宿主机操作
命令 解释
docker cp 容器与主机之间的数据拷贝
docker cp 实例
docker cp nginx:/www /tmp/ #将nginx容器的/www 拷贝到本地/tmp下
1.4生命周期命令
命令 解释
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker exec 在运行的容器中执行命令
docker run 创建一个新的容器并运行一个命令
docker exec 详细参数
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
#实例
docker exec -it nginx /bin/bash
docker run 详细参数
-i, --interactive=false 打开STDIN,用于控制台交互
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
-d, --detach=false 指定容器运行于前台还是后台,默认为false
-u, --user=“” 指定容器的用户
-a, --attach=[] 登录容器(必须是以docker run -d启动的容器)
-w, --workdir=“” 指定容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-m, --memory=“” 指定容器的内存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname=“” 指定容器的主机名
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录 顺序:主机:容器
–volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
–cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
–cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
–cidfile=“” 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
–cpuset=“” 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
–device=[] 添加主机设备给容器,相当于设备直通
–dns=[] 指定容器的dns服务器
–dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
–entrypoint=“” 覆盖image的入口点
–env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
–expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
–link=[] 指定容器间的关联,使用其他容器的IP、env等信息
–lxc-conf=[] 指定容器的配置文件,只有在指定–exec-driver=lxc时使用
–name=“” 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
–net=“bridge” 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似–net=bridge),但是不进行配置
–privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
–restart=“no” 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
–rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
–sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
1.5镜像仓库命令
命令 解释
docker pull 拉取镜像
docker search 从Docker Hub查找镜像
1.6docker环境信息命令
命令 解释
docker info 查看docker系统信息
docker version 显示 Docker 版本信息
二、 基于alpine基础镜像构建常见的系统服务, [nginx / jdk / tomcat]
安装docker
下载镜像
如果你过去安装过 docker,先删掉:
sudo apt-get purge docker-ce docker-ce-cli containerd.io -y
首先安装依赖:
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
信任 Docker 的 GPG 公钥:
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
添加软件仓库:
sudo add-apt-repository \
"deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu
\ $(lsb_release -cs) \ stable"
限制最新的docker版本安装
apt-cache madison docker-ce
apt install docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic -y
验证版本
docker version
sudo apt-get update
apt-get install docker-ce docker-ce-cli containerd.io -y
docker info
构建nginx镜像
docker pull nginx
使用宿主机的8888端口映射nginx容器的80端口,这样它可以在当前终端的前台运行。
docker run -it -p 8888:80 nginx
在浏览器就可以访问了:
分层构建镜像
构建centos底层镜像
先做一个基本镜像:
root@10ubuntu-yangk:~# cd /opt/dockerfile/system/centos/
root@10ubuntu-yangk:/opt/dockerfile/system/centos# vim Dockerfile
Dockerfile内容
#指定基础镜像(后期会在这里创建TAG获取时间戳传参)
FROM centos:7.8.2003
#添加作者信息
LABEL MAINTAINER="yk 568656476@qq.com"
#并安装基础命令
RUN yum install -y epel-release && yum install -y gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2 openssl-devel iotop vim gcc-c++ aotumake pcre pcre-devel zlib openssl lrzsc tree
#创建用户
RUN groupadd www -g 2022 && useradd www -u 2022 -g www
构建镜像脚本:
vim build-command.sh
#!/bin/bash
docker build -t harbor.magedu.com/m43/centos-base:7.8.2003
执行脚本
bash build-command.sh
第二层 jdk镜像
创建文件夹(便于管理)
root@10ubuntu-yangk:/opt/dockerfile/web/jdk# mkdir jdk-8u-212
root@10ubuntu-yangk:/opt/dockerfile/web/jdk# cd jdk-8u-212/
root@10ubuntu-yangk:/opt/dockerfile/web/jdk/jdk-8u-212#
jdk下载网址:https://www.oracle.com/java/technologies/downloads/#java8-linux
jdk下载网址:https://www.oracle.com/java/technologies/downloads/#java8-linux
xftp上传报错:
解决(相关路径): chmod 777 /opt/dockerfile/web/jdk/jdk-8u-212
准备Dockerfile
root@10ubuntu-yangk:/opt/dockerfile/web/jdk/jdk-8u-212# vim Dockerfile
#添加作者信息
LABEL MAINTAINER="yk 568656476@qq.com"
#添加jdk路径并解压
ADD jdk-8u212-linux-x64.tar.gz /usr/local/src
#jdk做软连接,方便后期升级
RUN ln -sv /usr/local/src/jdk1.8.0_212 /usr/local/jdk
ADD profile /etc/profile
#环境变量
ENV name magedu
#ENV JAVA_HOME /usr/local/jdk
#ENV JRE_HOME $/JAVA_HOME/jre
准备build脚本
root@10ubuntu-yangk:/opt/dockerfile/web/jdk/jdk-8u-212# vim build-command.sh
#!/bin/bash
docker build -t harbor.magedu.com/m43/centos-jdk-bash:8u212 .
拷贝profile,并在其中添加环境变量
docker cp c5802c69f688:/etc/profile .
vim profile
最下方添加:
export JAVA_HOME=/usr/local/jdk/
export TOMCAT_HOME=/apps/tomcat
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
运行构建脚本
bash build-command.sh
进容器测试:
root@10ubuntu-yangk:/opt/dockerfile/web/jdk/jdk-8u-212# docker run -it --rm harbor.magedu.com/m43/centos-jdk-bash:8u212 bash
[root@5bd91b61b05f /]# cat etc/profile
测试java环境:
[root@5bd91b61b05f /]# su - www
[www@5bd91b61b05f ~]$ java -version
给root加env
root@10ubuntu-yangk:/opt/dockerfile/web/jdk/jdk-8u-212# vim Dockerfile
最后加上:
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
重构
root@10ubuntu-yangk:~# docker run -it --rm harbor.magedu.com/m43/centos-jdk-bash:8u212 bash
第三层tomcat镜像层
创建文件件
进到tomcat(略)
网站:https://tomcat.apache.org/,下载tomacat压缩包
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.65/bin/apache-tomcat-8.5.65.tar.gz
准备Dockerfile
#tomecat base image
FROM harbor.magedu.com/m43/centos-jdk-base:8u212
#添加作者信息
LABEL MAINTAINER="yk 568656476@qq.com"
#这次使用挂载,容器数据备份
#VOLUME /data /apps
ADD apache-tomcat-8.5.65.tar.gz /apps
#jdk做软连接,方便后期升级,后期把这个软连接换一下版本就直接升级了,其他步骤不用做了,因为tomcat是公用的,最后放入代码再构建一次就OK了
RUN ln -sv /apps/apache-tomcat-8.5.65 /apps/tomcat
准备构建脚本
root@10ubuntu-yangk:/opt/dockerfile/web/tomcat# vim build-command.sh
#!/bin/bash
docker build -t harbor.magedu.com/m43/tomcat-centos-base:v8.5.65
执行构建脚本
bash build-command.sh
进入容器,运行tomcat
docker run -it harbor.magedu.com/m43/tomcat-centos-base:v8.5.65 bash
apache-tomcat-8.5.65
[root@d237da51437c /]# chown www.www /apps/ -R
[root@d237da51437c /]# su - www -c "/apps/tomcat/bin/catalina.sh start"
退出,映射端口运行
docker run -it -p 8080:8080 harbor.magedu.com/m43/tomcat-centos-base:v8.5.65 bash
浏览器访问
第四层:业务层镜像
创建文件夹
mkdir tomcat-base-8.5.65
进入app1路径,新建Dockerfile
#项目(magedu)档期(m43) tomecat app1
FROM harbor.magedu.com/m43/tomcat-centos-base:v8.5.65
#添加作者信息
LABEL MAINTAINER="yk 568656476@qq.com"
#添加tpmcat脚本,app(通常都是var包)这里用目录做个示例,这样是不严谨的
#ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
ADD hello-world.tar.gz /apps/tomcat/webapps/
#修改权限
RUN chown www.www /apps/ -R
#声明端口
EXPOSE 8080 8443
上传压缩.war文件
tar czvf hello-world.tar.gz hello-world.war
启动tomcat脚本
#[root@d237da51437c /]# chown www.www /apps/ -R
#[root@d237da51437c /]# su - www -c "/apps/tomcat/bin/catalina.sh start"
root@10ubuntu-yangk:/opt/dockerfile/web/tomcat/tomcat-app1# vim run_tomcat.sh
#!/bin/bash
#chown www.www /apps/ -R
su - www -c "/apps/tomcat/bin/catalina.sh start"
tail -f /etc/hosts
构建脚本
构建:root@10ubuntu-yangk:/opt/dockerfile/web/tomcat/tomcat-app1# vim build-command.sh
#!/bin/bash
docker build -t harbor.magedu.com/m43/tomcat-m43:app1 .
执行构建脚本
bash build.sh
测试:
docker run -it --rm -p 8000:8080 harbor.magedu.com/m43/tomcat-m43:app1;
三、将构建的镜像放在阿里云仓库。
登录阿里云,开通实例(个人版)
构建镜像并上传
1. 登录阿里云Docker Registry
$ docker login --username=aliyun7477019344 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/yangkaibvv/centos-app:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=aliyun7477019344 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/yangkaibvv/centos-app:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/yangkaibvv/centos-app:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.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
四、 将构建的镜像,放在自建的harbor中,并且单独可以提供相应的服务
安装harbor之前要先安装docker(同上)、docker-compose,安装docker-compose:
下载docker-compos压缩包:https://goharbor.io/
放入指定路径:
cd /usr/local/src/harbor/
解压之后,直接查看版本
./docker-compose-Linux-x86_64 version
安装harbor
root@10ubuntu-yangk:/usr/local/src/harbor# ./install.sh
拷贝简化:
root@10ubuntu-yangk:/opt# cp docker-compose-Linux-x86_64 /usr/bin/docker-compose
保证系统可以执行docker-compose命令
修改配置文件:
vim harbor.yml
本地加解析:
访问自己的域名
新建项目
上传镜像
本地docker服务器加解析
vim /etc/hosts
添加信任
vim /lib/systemd/system/docker.service
--insecure-registry harbor.magedu.com
docker服务器登录harbor
docker login harbor.XXXXu.com
更改tag
docker tag harbor.magedu.com/m43/centos-base:7.8.2003 harbor.XXXXdu.com/m43/centos-base:7.8.2003
上传镜像
docker push harbor.XXXXdu.com/m43/centos-base:7.8.2003
上传成功
启动02,从harbor上pull镜像并验证,重复上述操作
docker pull harbor.XXXXdu.com/m43/tomcat-m43:app2
运行并访问: 成功
五、docker的常见网络模式
5.1 bridge模式(重点讲,其他略)
利用宿主机的网卡进行通信,因为涉及到网络转换,所以会造成资源消耗,网络效率会低。
启动docker-01
docker run -it -d --name XXXXu-tomcat-app1 harbor.XXXXu.com/m43/tomcat-m43:app1
启动nginx容器:–link
docker run -it -d -p 80:80 --link XXXXdu-tomcat-app1 nginx:latest
进入容器
进入容器:
root@10ubuntu-yangk:~# docker exec -it bdb684e9ec5d bash
cat /etc/hosts
### 可以看到另一个容器的地址已经被加到hosts解析中,ping测试
成功
5.2 host模式
特点:容器和宿主机共享网络
5.3 container模式
新创建的容器间使用已创建的容器网络,类似一个局域网
特点:容器和容器间共享网络
5.4 none模式
这种模式最纯粹,不会帮你做任何网络的配置,可以最大限度的定制化。
5.5 overlay/overlay2模式
容器彼此不再同一网络,而且能互相通行。
六、用docker-compose 将2中构建的镜像组合起来提供服务。
安装docker-compose(略)、拉取nginx镜像(上文)、拉取tomcat镜像(上文)
单机版docker-compose+nginx+tomcat快速实现
配置docker-compose.yml
version: '3.9'
services:
nginx-server:
image: nginx:latest
# image: harbor.XXXXdu.com/m43/tomcat-m43:app1
container_name: nginx-web1
#network_mode: bridge #网络1,使用docker安装后的默认网桥
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有两块网卡
# - front
- backend
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"
links:
- tomcat-service-app1
tomcat-service-app1:
image: harbor.XXXXdu.com/m43/tomcat-m43:app1
container_name: tomcat-app1
#network_mode: bridge #网络1,使用docker安装后的默认网桥
volumes:
- /data/testapp:/data/tomcat/webapps/testapp
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有两块网卡
- backend
expose:
- 8080
- 8443
ports:
- "8080:8080"
- "8443:8443"
networks:
front: #自定义前端服务网络
driver: bridge
backend: #自定义后端服务网络
driver: bridge
default: #使用已经存在的docker0默认172.17.0.1/16的网络
external:
name: bridge
配置nginx文件:
root@aadcb36e92ce:/# vim /etc/nginx/nginx.conf ,这里不能粘贴,只能sed流插入到最后
显示servername
echo " upstream web{
server tomcat-service-app1:8080;
}
server{
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /data/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /hello-world {
proxy_pass http://web;
}
#proxy the PHP scripts to Apache listening on 127.0.0.1:80
}" >> /etc/nginx/nginx.conf
重启nginx
/usr/sbin/nginx -s reload
访问nginx页面:http://10.0.0.152/hello-world/
访问nginx自动跳转到tomcat业务页面
如果觉得对您有用,请点个赞哦♪(^∀^●) ↓↓↓