Docker基础
Posted wangph
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker基础相关的知识,希望对你有一定的参考价值。
目录
Docker基础
一 docker 容器介绍
1.1 docker的理念
一次构建,多处运行、
拒绝ssh,日抛型的隐形眼镜
1.2 docker的组成
CS架构
组成与组件
docker由docker server和docker client组成
docker组件包括镜像、容器、仓库
docker对比kvm
类别 | Docker | KVM/OpenStack |
---|---|---|
部署难度 | 非常简单 | 组件多,部署复杂 |
启动速度 | 秒级 | 分钟级 |
执行性能 | 与物理系统几乎一致 | VM会占用一些资源 |
镜像体积 | 镜像是MB级别 | 虚拟机镜像是GB级别 |
管理效率 | 管理简单 | 组件相互依赖,管理复杂 |
隔离性 | 隔离性高 | 彻底隔离 |
可管理性 | 单进程,不建议启动SSH | 完成的系统管理 |
网络连接 | 比较弱 | 建筑Neutron可以了灵活组建各类网络架构 |
1.3 docker 能干什么
简化配置
流水线管理
提高开发效率
应用隔离
整合服务器资源
debug
多租户能力??
快速部署
1.4 docker改变了什么
产品交付:直接交付镜像 dockerfile
面向开发:简化环境配置
面向测试:多版本测试 -- 较少提测排队时间
面向运维:环境一致性
面向架构:自动化扩容(微服务)
1.5 基于docker的不可变基础设施
故障来源于变更
用替换的方式来做变更、回滚
一旦上线 上线的内容不可变
二 Docker镜像和容器管理
2.1 相关站点
Docker官网
Docker官方文档
阿里云镜像站
Docker HUB
2.2 Docker部署与实践
系统环境:
cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
2.2.1 安装docker-ce源
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.2.2 安装docker-ce
yum install docker-ce -y
2.2.3 启动docker
systemctl enable docker.service
systemctl start docker.service
# 无法启动 删除/var/lib/docker 重新下载
2.2.4 常用命令
docker search centos # 搜索镜像
docker pull centos
docker images
# 镜像导出 当前路径下
docker save -o centos.tar centos:latest
# 镜像导入
docker load < centos.tar # <==> docker --input centos.tar
# 镜像删除
docker rmi images_name # <==> docker rmi images_id
安装系统 并没有安装系统内核,只是lib库之类的。
所以即使在centos的宿主机上起了ubuntu的容器,但是设计到内核的一些特性,还是依赖于centos系统。反之亦然
启动容器 即是启动镜像
可以启动一个已经pull下来的镜像,也可以启动一个不存在的镜像
docker run centos /bin/echo ‘Hello world‘
docker ps -a # -a 看到所有的容器 包括已经exited的
docker run的时候 先检查本地是否有镜像 ,没有就先pull
docker在会在前台运行一个任务,任务结束,容器即停止。
如果我们用docker运行一个nginx,那我们需要保证这个nginx任务不能停止。
docker run --name mydocker -t -i centos /bin/bash # -t tty 分配一个伪终端 -i 标准输入
[[email protected] ~]# docker run --name mydocker -t -i centos /bin/bash
[[email protected] /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.6 0.0 11820 1908 pts/0 Ss 06:57 0:00 /bin/bash
root 14 0.0 0.0 51708 1700 pts/0 R+ 06:58 0:00 ps -aux
[[email protected] /]# exit
此时执行docker ps -a
会发现刚才起的容器已经退出。因为我们在这个docker运行的任务是/bin/bash。退出了bash,容器就自动停止了。
docker start mydocker
docekr stop mydocker
docker run .... -h hostname # 指定主机名
2.2.6 进入容器的三张方式
- attach
docker attach mydocker # 缺点 多个窗口同步进入 会同步显示,一个命令阻塞,所有窗口无法操 退出即终止
退出方式:ctrl + P 再+q
- nsenter # namespace enter nsenter 进入容器 需要容器的pid
生产中用到的比较多
# 需要安装
yum install util-linux
获取docker详情
docker inspect mydocker
只获取容器pid:(容器第一个进程的PID)
docker inspect --format "{{.State.Pid}}" mydocker
nsenter进入容器
nsenter --target 19265 --mount --uts --ipc --net --pid
# --mount 指定命名空间
# 。。。
这时候执行exit 不会退出docker里面的bash, docker进程不会终止
进入脚本:
#!/bin/bash
# Use nsenter to access docker
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
nsenter -t $PID -m -u -i -n -p
}
docker_in $1
- docker exec
这个命令用来在 一个正在运行的容器中去执行命令
docker exec mydocker whoami
可以巧妙的利用这个命令去进入容器
docker exec -it mydocker /bin/bash
docker exec 退出不影响进程。
三种方式总结
attach 使用的是容器本身的bash 所以exit退出 会停止容器
nsenter 和 docker exec是开启了一个新的bash
docker inspest docker_name # 容器详情 用法:可以使用-f指定参数
docker rm docker_name # 删除正在运行的容器会报错 需要先stop 可强制删除 -f 生产禁止!
docker run --rm centos /bin/echo "hehe" # 退出自动删除容器 --rm 测试用
2.2.7 docker支持tcp连接管理
vim /usr/lib/systemd/system/docker.service
# 修改配置
# ExecStart=/usr/bin/dockerd
# ExecStart=/usr/bin/dockerd -H tcp://192.168.56.12 # 重启会发现本地docker命令找不到socket
ExecStart=/usr/bin/dockerd -H tcp://192.168.56.12 -H unix://var/run/docker.sock
systemctl daemon-reload
systemctl restart docker.service
查看端口 默认:2375
netstat -lntup
#####
tcp 0 0 192.168.56.12:2375 0.0.0.0:* LISTEN 29849/dockerd
我们可以在其他机器通过tcp管理这台机器上的docker
[[email protected] ~]# docker -H 192.168.56.12 info
2.2.8 docker其他命令
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container‘s changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container‘s filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container‘s filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
2.2.9 docker run 命令
--cpuset-cpus 0 # 绑定运行在0号CPU上
-c 2048 # 指定cpu权重 默认1024
dockr run --help
三 Docker的网络访问和数据管理
3.1 Docker网络
3.1.1 docker网络访问
运行一个docker nginx
docker pull nginx
docker images
docker run -d -P nginx # -d 后台 -P 随机端口映射
docker ps # 可以查看到一个随机端口,可以通过这个端口访问
docker logs ‘docker_id(name)’ # 查看日志 nginx运行在前台
docker run -d -p 3333:80 --name nginx-demo nginx # -p 指定映射端口,宿主机多个ip时 可以指定地址映射
# 可以只指定ip 不指定端口
# 默认协议tcp 可以 :udp 指定协议
docker port docker_name # 查看一个容器的映射端口
###
-d, --detach Run container in background and print container ID
如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的会话话中。需要注意的是,容器运行在后台模式下,是不能使用--rm选项的。
3.2.2 docker内网互通
同宿主机上内网互通
1、link 单机容器互通常用(别名)
docker run -itd --name test1 192.168.56.11/app/jenkins
docker run -itd --link test1:t1 --name test2 192.168.56.11/app/jenkins
## link Add link to another container,可以在test2中通过主机名t1访问test1
2、docker network
# 默认有三种模式
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
89f45a7a5f5d bridge bridge local
26f0654bc9db host host local
ed3b95232e9f none null local
host模式
# hosts模式,网卡模式与宿主机模式一致
# 先启动一台nginx 映射80端口
docker run --rm -itd --name test1 -p 80:80 nginx
#再绑定host网卡启动,不映射端口,前台运行,会发现报端口占用。
docker run --rm -it --name test2 --net=host nginx
# 优点:充分利用网卡的性能
# 缺点:容易对本地端口进行占用
# 只有对网络性能要求比较高的情况下才使用
bridge模式
docker rm -f $(docker ps -a -q)
# 创建一张自己的桥接网卡
docker network create --driver bridge gm0
docker network ls
# 查看网卡信息
[[email protected] ~]# ifconfig
br-8aac39faf141: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::42:1eff:fe1f:b0e6 prefixlen 64 scopeid 0x20<link>
ether 02:42:1e:1f:b0:e6 txqueuelen 0 (Ethernet)
RX packets 26 bytes 2340 (2.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 26 bytes 2340 (2.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:cdff:fed3:42bd prefixlen 64 scopeid 0x20<link>
ether 02:42:cd:d3:42:bd txqueuelen 0 (Ethernet)
RX packets 2644 bytes 112598 (109.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4596 bytes 6442280 (6.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 创建两台容器,查看IP
docker run --rm -itd -p 81:80 --name test1 nginx
# 172.17.0.2
docker run --rm -itd -p 82:80 --name test2 --network=gm0 nginx
# 172.18.0.2
## 生产环境指定网段
docker network create --driver bridge --gateway 192.168.10.1 --subnet 192.168.10.0/24 gm1
# --bridge 指定驱动
# --gateway 设定网关
# --subnet 设置子网
[[email protected] ~]# ifconfig
br-8aac39faf141: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::42:1eff:fe1f:b0e6 prefixlen 64 scopeid 0x20<link>
ether 02:42:1e:1f:b0:e6 txqueuelen 0 (Ethernet)
RX packets 26 bytes 2340 (2.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 26 bytes 2340 (2.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-bd9624c7d8ac: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255
ether 02:42:a7:91:11:ce txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:cdff:fed3:42bd prefixlen 64 scopeid 0x20<link>
ether 02:42:cd:d3:42:bd txqueuelen 0 (Ethernet)
RX packets 2644 bytes 112598 (109.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4596 bytes 6442280 (6.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 指定新网卡创建容器
docker run --rm -itd -p 83:80 --name test3 --network=gm1 nginx
# 192.168.10.2
# 指定新网卡创建容器,并指定ip
docker run --rm -itd -p 83:80 --name test3 --network=gm1 --ip=192.168.10.250 nginx
# 192.168.10.250
docker run --rm -it --ip 192.168.10.247 --name test11 --network=gm1 centos
docker run --rm -it --ip 192.168.10.248 --name test12 --network=gm1 centos
# 在两台容器中,互ping对方容器名称,可以直接ping通。
# 这个解析只对我们自定义的网络有效,可通过容器名进行解析。
# 1. 自建网络 2. 主机名不存在解析
不同docker网卡创建的容器如何互通(不同网段)
# 可以将一个容器绑定到另一个网卡上
# docker run --rm -it --ip 192.168.10.248 --name test12 --network=gm1 centos
docker network connect gm0 test12
# 此时test12 可以ping通绑定gm0网卡的容器。 这时test12会有两个ip,分别和两个网段进行通信
跨主机之间的docker容器互通
- consul overlay全局网卡 。 。 。
- Flanneld + Etcd
3.2 Docker数据数据存储
3.2.1 数据卷
volumes
-v /data
# 挂载一个目录到容器的/data目录下。挂到哪儿?
docker run -d --rm --name nginx-test1 -v /data nginx
docker inspect nginx-test1 # 找到Mounts信息
可以发现,我们不指定挂载源,docker默认挂载到:/var/lib/docker/volumes/
下,可以创建文件测试下
"Mounts": [
{
"Type": "volume",
"Name": "7171f9f4d0602af66d6aa0eb35733f09a35c84ac070480030c3aec469c4515a4",
"Source": "/var/lib/docker/volumes/7171f9f4d0602af66d6aa0eb35733f09a35c84ac070480030c3aec469c4515a4/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
生产常用 指定源挂载
-v src:det
docker run -d --name nginx-test2 -v /data/docker-volume-ngninx:/data nginx # src 目录会自动创建 (touch文件测试)
3.2.2 数据卷容器
开发环境: 挂载代码目录 -v /src:/dst
生产环境:存储持久化数据
--volumes-from
一个特殊的容器
# 把宿主机的/data直接挂载到容器volume-demo的/data
# 这个容器就可以当做数据卷容器
docker run -d --name volume-demo -v /data:/data nginx
其他容器想使用相同的数据时,可以--volumes-from 直接指定这个数据卷容器。可以共享数据卷容器挂载的容器。
docker run -d --name nginx-volume-demo --volumes-from volume-demo nginx
数据卷容器特性:
数据卷容器stop状态,不影响挂载目录的使用
作用:
启动一个logstash或者filebeat的容器,把这个容器当做数据卷容器。做log的采集。即使这个容器挂掉,也不影响日志的存储。
用法:
所有服务日志都写在 /data/logs/下
数据卷容器filebeat启动: -v /data/logs:/data/logs
其他容器启动 --volume-from filebeat
四 Docker镜像构建
4.1 Docker镜像手动构建
docker pull centos
docker run --name mynginx -it centos /bin/bash
## 安装epel源
rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install nginx -y
# 需要把nginx放到前台运行,否则docker会挂掉。
#在nginx.conf中加入
"daemon off;"
#退出容器
exit
docker commit -m ‘nginx on centos‘ ‘容器id‘ gm-nginx:v1
docker images # 可看到我们手动创建的镜像 gm-nginx:v1
测试镜像:
docker run -d -p 91:80 gm-nginx:v1 nginx # 最后的nginx是运行的命令
docker ps # 看到容器启动成功,访问192.168.56.11:91测试 OK
4.2 Dockerfile自动构建Docker镜像
dockerfile基础指令
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
***
FROM: 指定基础镜像 谁是他妈
MAINTAINER: 指定维护者信息
RUN: 在要执行的命令前加上RUN
ADD: copy文件,会自动解压
WORKDIR: 设置当前工作目录(相当于cd)
VOLUME: 设置卷,挂载目录
EXPOSE: 设定打开的端口
CMD: 指定容器启动后要干的事情
dockerfile for nginx
mkdir -p /opt/dockerfile/gm-nginx
cd /opt/dockerfile/gm-nginx
vim Dockerfile
文件内容
# Base Image
From centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx --enablerepo=epel
RUN yum clean all # 让打包的镜像尽可能的小一点
RUN echo "daemon off;" >> /etc/nginx/nginx.conf # 在生产中 我们直接add一个nginx.conf文件进去 不要更改文件
#ADD
# add 的文件要和Dockerfile在同一级目录下.
ADD index.html /usr/share/nginx/html/index.html
#WORKDIR
#VOLUME
#EXPOSE
EXPOSE 80
#CMD
CMD ["nginx"]
# 当前目录下执行:
echo "nginx in docker" > index.html
docker build -t gm-nginx:v2 . # -t 打tag . (点)代表当前目录的Dockerfile
# 查看生成镜像
docker images
Dockerfile中CMD与ENTRYPOINT的区别
ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖,需谨记
CMD,表示镜像运行默认参数,可被重写覆盖
ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!
4.3 镜像构建最佳实践
Dockerfile中层的概念
dockerfile中每一行的一个指令,都会生成一个层。每个Dockerfile中,都有From centos
,centos镜像只下载一次,不会重复下载。一个存在的层,不会重复构建
分层构建
系统无内核,只是一个操作环境
4.3.1 系统层 构建Centos+SSH镜像
用惯了虚拟机,强依赖SSH服务的。。。。还是得装一个。
1. Docker镜像分层构建
docker镜像是分层存储的 构建也要分层构建
Dockerfile中的每一个指令,都会在镜像中有一个层
# 创建目录层级结构
cd /opt/dockerfile
mkdir -p system/centos runtime app
cd system/centos
vim Dockerfile
################## file start ##################
# Base Image
From centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx --enablerepo=epel
RUN yum install -y wget sudo git tree net-tools openssh-clients openssh-server openssh-devel && yum clean all
################## file end ##################
# 构建镜像并查看
docker build -t system/centos:v1 .
docker images
mkdir system/centos-ssh && cd system/centos-ssh
vim Dockerfile
################## file start ##################
# Base Image
From centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx --enablerepo=epel
RUN yum install -y sudo git tree net-tools openssh-clients openssh-server openssh-devel && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
# Set root password
RUN echo "root:123123" |chpasswd
################## file end ##################
# 构建镜像并查看
docker build -t system/centos:v2 .
docker images
docker run -d --rm --name centos-ssh-demo -p 8022:22 system/centos:v2 /usr/sbin/sshd -D
ssh [email protected] -p 8022 # pass: 123123
4.3.2 Supervisor管理容器多进程
docker容器 只能在前台运行一个程序。如何搞定??
- -d 后台运行
- 脚本管理多个服务,保证脚本不退出。比如死循环
- suoervisor管理 -- good
在刚才创建的容器中安装配置Supervisor
yum install -y supervisor
# 修改配置文件 /etc/supervisord.conf中 nodaemon=false
# 让supervisor启动在前台
nodaemon=true ; (start in foreground if true;default false)
###
保存supervisord.conf到dockerfile同级目录
在当前目录准备文件sshd.ini(下面会用到)
# sshd.ini
[program:sshd]
command=/usr/sbin/sshd -D
process_name=%(program_name)s
autostart=true
构建Supervisor的镜像
docker build -t system/centos . # 不打标签,最新版本 latest
docker images
docker run -d --name centos-ssh-supervisor -p 2222:22 system/centos
ssh 192.168.56.11 -p 2222 # 密码 123123
4.3.3 环境层 构建JDK+Tomcat运行环境镜像
cd /opt/dockerfile/runtime/
mkdir tomcat && cd tomcat
vim Dockerfile
################## file start ##################
# Base Image
From system/centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel && yum clean all
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk
# For tomcat Add 自动解压 COPY没有其他特性
ADD apache-tomcat-8.5.33.tar.gz /usr/local/
RUN ln -s /usr/local/apache-tomcat-8.5.33 /usr/local/tomcat
# For supervisor
ADD tomcat.ini /etc/supervisord.d/tomcat.ini
ENV TOMCAT_HOME /usr/local/tomcat
# Outside port
EXPOSE 22 8080
# CMD
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
################## file end ##################
当前目录准备tomcat安装包和tomat.ini文件
wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.33/bin/apache-tomcat-8.5.33.tar.gz
vim tomcat.ini
################## file start ##################
[program:tomcat]
command=/usr/local/tomcat/bin/catalina.sh run
process_name=%(program_name)s
autostart=true
################## file end ##################
构建镜像测试
cd /opt/dockerfile/runtime/tomcat
docker build -t runtime/tomcat .
docker run -d --name tomcat-demo -p 8080:8080 -p 8888:22 runtime/tomcat
测试容器
ssh 127.0.0.1 -p8888 #pass 123123
# 浏览器访问:http://192.168.56.11:8080
# success
4.3.4 应用层 构建jenkins应用镜像
系统+环境的镜像已经构建,应用只需要ADD包进去就OK
cd /opt/dockerfile/app/
mkdir jenkins && cd jenkins
vim Dockerfile
################## file start ##################
From runtime/tomcat
MAINTAINER wph
ADD jenkins.war /usr/local/tomcat/webapps/
EXPOSE 22 8080
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
################## file end ##################
准备jar包
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
构建测试
docker build -t app/jenkins .
docker run -d --name jenkins-demo -p 98:22 -p 99:8080 app/jenkins
访问测试:
# 浏览器访问: http://192.168.56.11:99/jenkins
# success
构建升级
Dockerfile最佳实践
Docker最佳实践之多阶段构建
################## file start ##################
################## file end ##################
五 构建Docker私有仓库
5.1 官方registry构建私有仓库
[[email protected] ~]# docker run -d --name docker-registry -p 5000:5000 registry
Unable to find image ‘registry:latest‘ locally
...
用官方提供的registry镜像启动,默认5000端口。
官方要求使用https认证,
我们使用http的方式,需要在docker服务中配置信任我们的私有仓库。
vim /etc/docker/daemon.json # 这个文件最后一行不能有逗号!!!
################## file start ##################
{
"registry-mirrors": ["https://38zi2wqv.mirror.aliyuncs.com"],
"insecure-registries": ["http://192.168.56.11:5000"]
}
################## file end ##################
registry-mirrors: docker镜像源指定,这里配置的是阿里云的源
insecure-registries:配置我们的私有仓库
需要重启docker服务
registry仓库的使用验证
docker tag app/jenkins 192.168.56.11:5000/app/jenkins
docker push 192.168.56.11:5000/app/jenkins
docker rm -f jenkins-demo
docker rmi app/jenkins
docker rmi 192.168.56.11:5000/app/jenkins
docker pull 192.168.56.11:5000/app/jenkins
docker run -d --name jenkins-demo -p 98:22 -p 99:8080 192.168.56.11:5000/app/jenkins
registry没有认证
5.2 Harbor构建docker私有仓库
Harbor是Vmware开源的docker镜像仓库管理工具。
Harbor官网
下载offline版本(内有全部包,无须下载),被墙的话,用浏览器FQ下载。
或者FQ服务器下载,发送过来。
5.2.1 下载工具
yum install -y python-pip
pip install docker-compose
pip list|grep docker-compose
# docker-compose 一个docker的管理工具,可以快捷的启动集群
删除之前创建的实验容器
# 列出所有的容器ID
docker ps -a -q
# 快速删除 生产禁用!!!
docker rm $(docker ps -a -q)
5.2.2 下载安装部署
# wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0-rc2.tgz
tar zxf harbor-offline-installer-v1.6.0-rc2.tgz
cd harbor/
cat docker-compose.yml
# 查看这个文件docker-compose.yml,启动的是80 443 4443端口,保证本机没有占用。否则需要更改
# 所以我们需要修改上文配置的daemon.json,去掉5000端口,重启docker服务。
# 更改配置文件
# 主机名改为本机IP或对外域名
# 可选协议控制,这里不做更改ui_url_protocol = http
sed -i.ori ‘s#hostname = reg.mydomain.com#hostname = 192.168.56.11#g‘ harbor.cfg
# 默认密码:harbor_admin_password = Harbor12345
### 安装:
# 确认 docker-compose 命令安装正确,且可执行
# 执行安装脚本:
./install.sh
# 安装成功后,查看状态:
docker-compose ps # 需要在当前目录执行 可执行 stop start 。。
5.2.3 异常处理
界面访问192.168.56.11,Ng502,经过查阅,可能是harbor版本问题
实验改用:harbor-offline-installer-v1.5.1.tgz版本
docker-compose down
重装还不行的话,删除挂载目录,再删除所有镜像。
重新验证:
浏览器访问192.168.56.11
user:admin
pass:Harbor12345 # harbor.cfg 配置文件中指定
5.3 harbor管理
在harbor新建项目
在客户端登录测试,并push镜像
# 登录
docker login 192.168.56.11
user:admin
pass:Harbor12345
# 打tag
docker tag app/jenkins 192.168.56.11/app/jenkins
# push镜像
docker push 192.168.56.11/app/jenkins # 注意先创建项目app
在界面查看镜像,可以看到成功推送的镜像。
在其他节点使用Harbor,
- 在/etc/docker/daemon.json配置信任
- docker login 192.168.56.11
以上是关于Docker基础的主要内容,如果未能解决你的问题,请参考以下文章
markdown [Docker] Docker片段列表和命令#linux #docker #snippets