Docker快速入门
Docker安装
在Rocky8上,可以先配置对应版本的yum仓库,然后使用yum工具安装Docker
1.先安装yum-utils工具
yum install -y yum-utils
2.配置Docker官方的yum仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.查看Docker版本
yum list docker-ce --showduplicates | sort -r
4.安装指定版本Docker
yum install docker-ce-20.10.9-3.el8
如果不指定版本,就安装最新版
yum install docker-ce
5.启动服务
systemctl start docker
systemctl enable docker
Docker镜像和容器
关于镜像这个词,大家并不陌生,比如系统安装盘就叫镜像,另外我们常见的Ghost技术做的GHO系统镜像和这个Docker镜像非常像。我们可以将GHO镜像安装到任何计算机上,这样就拿到了跟源系统一模一样的系统。 当然Docker镜像也有它独特之处,比如它是分层的,这个后续在拉取镜像时可以看到。
Docker镜像拉取下来后,可以直接运行,运行后的东西我们叫做容器,一个镜像可以启动很多容器。
容器就是镜像启动后的状态,在Linux系统里看就是一个进程,但容器是可以进入得,就像进入了一个虚拟机里。
1.配置加速器 编写/etc/docker/daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
EOF
重启docker服务
systemctl restart docker
检查是否生效
docker info |grep -A 3 'Registry Mirrors'
2.拉取镜像
docker pull busybox ##这个busybox就是系统镜像名字,它是从hub.docker.com去拉取镜像
3.查看当前系统镜像
docker image ls
4.搜索镜像
docker search ubuntu
如果要查询镜像版本,可以访问https://hub.docker.com/,搜索对应的镜像名字,然后点tag进行查看

拉取指定版本镜像
docker pull nginx:1.23.2
5.给镜像打标签
docker tag busybox:latest CloudPLayer:1.2.3
6.启动容器
docker run -itd busybox ##把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面
7.查看容器
docker ps -a ##如果不加-a,则不显示已经停止的容器
8.停止容器
docker stop de1fb9c8902e ##后面这一串字符串为容器ID,可以通过docker ps查看
9.删除容器
docker rm de1fb9c8902e ##如果容器未停止,会报错,需要加-f选项
10.删除镜像
docker rmi CloudPLayer:1.2.3 ##这里因为CloudPLayer:1.2.3为busybox的一个tag,所以此操作只会删除此tag,并不会真正删镜像,如果该镜像没有tag,则直接删除镜像
也可以直接指定镜像ID
docker rmi beae173ccac6
11.拉取镜像+启动容器
docker run -itd redis
12.启动容器时,给容器自定义名字
docker run --name web01 -itd ubuntu
13.容器运行后直接退出并删除
docker run --rm -it ubuntu bash -c "sleep 30"
14.进入容器操作
docker exec -it web01 bash
进去后,相当于进入了一个虚拟机一样,安装个nginx
apt update
apt install -y nginx
15.将容器重新打包成新镜像
docker commit -m "install nginx" -a "Cloud" web01 nginx_ubuntu:1.0 ##这里的web01可以改为容器id
再次查看镜像列表,发现多了一个nginx_ubuntu:1.0
16.将镜像保存为一个文件
docker save nginx -o nginx.img
17.将导出的镜像文件导入
docker load --input nginx.img
18.将容器导出为一个文件
docker export web01 > web01.tar
19.将导出的文件导入为新的镜像
docker import - ubuntu_test < web01.tar
20.docker save和docker export的差异
docker save保存的是镜像,docker export保存的是容器
docker save会保留镜像所有的历史记录,docker export不会,即没有commit历史
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
Docker的数据持久化
1.将本地目录映射到容器里
mkdir -p /data/
docker run -tid -v /data/:/data ubuntu bash ## -v 用来指定挂载目录 :前面的/data/为宿主机本地目录 :后面的/data/为容器里的目录,会在容器中自动创建
可以在/data/里创建一个文件
echo "hello" > /data/1.txt
然后到容器里查看
docker exec -it c82a5a00ae68 bash -c "cat /data/1.txt"
2.数据卷
创建数据卷
docker volume create testvol ##testvol为数据卷名字
列出数据卷
docker volume ls
查看数据卷信息
docker volume inspect testvol
使用数据卷
docker run -itd --name Cloud01 -v testvol:/data/ ubuntu ##和前面直接映射本地目录不同,冒号左边为数据卷名字
多个容器共享一个数据卷
docker run -itd --name Cloud02 -v testvol:/data/ ubuntu
3.将宿主机上的文件快速传输进容器里
docker cp /etc/fstab Cloud01:/tmp/test.txt
docker exec -it Cloud01 cat /tmp/test.txt
Docker网络
Docker服务启动时会生成一个docker0的网卡,这个网卡是实现容器网络通信的根本。 默认容器使用的网络类型为桥接(bridge.模式,这个桥接和我们的vmware里的桥接可不是一回事。它更像是vmware的NAT模式。 每启动一个容器,都会产生一个虚拟网卡 vethxxx
iptables -nvL -t nat ##可以看到DOCKER相关规则,容器之所以可以联网,是靠这些规则实现的
1.host模式
docker run -itd --net=host --name Cloud03 ubuntu
可以进入容器内,查看hostname,查看ip地址。 这种模式,容器和宿主机共享主机名、IP。
2.container模式 该模式下,在启动容器时,需要指定目标容器ID或者name,意思是将要启动的容器使用和目标容器一样的网络,即它们的IP一样
docker run -itd --net=container:/Cloud01 --name Cloud04 ubuntu
可以进入容器查看Cloud01和Cloud04的网络情况
3.none模式 即不需要配置网络
docker run -itd --net=none --name=Cloud05 ubuntu_test bash
查看:
docker exec -it Cloud05 bash -c "ip add"
4.bridge模式 也就是默认模式,可以–net=bridge 也可以不指定–net,默认就是bridge
5.端口映射
docker run -itd -v /data/:/var/www/html/ -p 8088:80 --name Cloud06 ubuntu_test bash
说明: -p后面跟 宿主机监听端口:容器监听端口
Dockerfile编写
什么是Dockerfile?是实现自定镜像的一种手段,通过编写Dockerfile,来编译成自己想要的镜像。
Dockerfile 格式 1.FROM 指定基于哪个基础镜像,例如:
FROM ubuntu:latest
2.MAINTAINER 指定作者信息,例如:
MAINTAINER Cloud Cloud@CloudPLayer
3.RUN 后面跟具体的命令,例如:
RUN apt update
RUN apt install -y curl
RUN ["apt","install","-y","curl" ] ##这种写法偏复杂
4.CMD 用来指定容器启动时用到的命令,只能有一条,格式如下:
CMD ["executable", "param1", "param2"]
CMD command param1 param2
CMD ["param1", "param2"]
CDM示例:
CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
5.EXPOSE 指定要映射的端口,格式:
EXPOSE <port> [<port>...]
EXPOSE示例:
EXPOSE 22 80 8443 ##要暴露22,80,8443三个端口
说明:这个需要配合-P(大写.来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写.来指定。
6.ENV 为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量,例如
ENV MYSQL_version 5.7
7.ADD 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。例如:
ADD conf/vhosts /usr/local/nginx/conf
8.COPY 类似于ADD,将本地文件拷贝到容器里,不过它不支持URL,例如:
COPY 123.txt /data/456.txt
9.ENTRYPOINT 格式类似CMD 容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。 和CMD不同是: CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。 比如,容器名字为Cloud 我们在Dockerfile中指定如下CMD:
CMD ["/bin/echo", "test"]
假如启动容器的命令是
docker run Cloud
则会输出 test
假如启动容器的命令是
docker run -it Cloud /bin/bash
则什么都不会输出
ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行
ENTRYPOINT ["echo", "test"]
假如启动容器的命令是
docker run -it Cloud 123
则会输出 test 123 ,这相当于要执行命令 echo test 123
10.VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点。
VOLUME ["/data"]
11.USER指定RUN、CMD或者ENTRYPOINT运行时使用的用户
USER Cloud
12.WORKDIR 为后续的RUN、CMD或者ENTRYPOINT指定工作目录
WORKDIR /tmp/
Dockerfile示例:
vi Dockerfile
FROM ubuntu:22.04
MAINTAINER Cloud Cloud@CloudPLayer
RUN sed -i 's/https:\/\/mirrors.aliyun.com/http:\/\/mirrors.cloud.aliyuncs.com/g' /etc/apt/sources.list
RUN apt clean
RUN apt update
RUN apt install -y libpcre2-dev net-tools gcc zlib1g-dev make
ADD https://nginx.org/download/nginx-1.24.0.tar.gz .
RUN tar zxvf nginx-1.24.0.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.24.0 && ./configure --prefix=/usr/local/nginx && make && make install
COPY index.html /usr/local/nginx/html/index.html
#COPY index2.html /usr/local/nginx/html/2.html
EXPOSE 80
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;"
编译成镜像
docker build -t cloudplayer_nginx:1.0 .
说明: -t 后面跟镜像名字:tag, 这里的. 表示使用当前目录下的Dockerfile,并且工作目录也为当前目录,如果想使用其它目录下的Dockerfile,还可以使用-f选项来指定,例如
docker build -t ubuntu_nginx:1.0 -f /data/docker/nginx.dkf /tmp/ ##这里/tmp/目录为工作目录,比如COPY文件的时候,到/tmp/下面去找
使用镜像
docker run -itd --name nginx -P ubuntu_nginx:1.0 ##使用-P(大写P.可以随机映射一个端口到宿主机,也可以使用-p(小p.指定具体端口
docker-compose
Docker compose可以方便我们快捷高效地管理容器的启动、停止、重启等操作,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息。 我们可以在一个compose文件中定义一个多容器的应用(比如wordpress.,然后通过该compose来启动这个应用。
1.安装docker-compose 官方地址
curl -L https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose
测试并查看版本
docker-compose version
2.用docker-compose快速部署应用
编辑wordpress的compose yaml文件
vi docker-compose.yml ##写入如下内容
services:
db: # 服务1:db
image: mysql:5.7 # 使用镜像 mysql:5.7版本
volumes:
- db_data:/var/lib/mysql # 数据持久化
restart: always # 容器服务宕机后总是重启
environment: # 环境配置
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress: # 服务2:wordpress
depends_on: # wordpress服务启动时依赖db服务,所以会自动先启动db服务
- db
image: wordpress:latest # 使用镜像 wordpress:latest最新版
ports:
- "8000:80" #端口映射8000:80
restart: always
environment: # 环境
WORDPRESS_DB_HOST: db:3306 # wordpress连接db的3306端口
WORDPRESS_DB_USER: wordpress # wordpress的数据库用户为wordpress
WORDPRESS_DB_PASSWORD: wordpress # wordpress的数据库密码是wordpress
WORDPRESS_DB_NAME: wordpress # wordpress的数据库名字是wordpress
volumes:
db_data: {}
启动
docker-compose up -d
查看
docker-compose ps
还可以停止
docker-compose stop
私有镜像仓库harbor搭建
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是 由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。
0.提前准备一个ca证书 如果有自己的域名,可以到https://freessl.cn/ 申请免费的ssl证书
安装好docker-compose
1.下载harbor离线包 https://github.com/goharbor/harbor/releases
我这里下载的是2.6.2
2.将下载的包上传到linux,解压
tar zxf harbor-offline-installer-v2.6.2.tgz -C /opt/
3.准备配置文件
cd /opt/harbor
cp harbor.yml.tmpl harbor.yml ##将模板配置文件拷贝一份为正式的配置文件
4.编辑配置文件
vi harbor.yml
修改 hostname: reg.mydomain.com 为 hostname: harbor.yuankeedu.com
修改 certificate: /your/certificate/path 和 private_key: /your/private/key/path 为具体的证书地址
修改 harbor_admin_password 为合适的密码
5.安装
sh install.sh
6.服务的停止和启动
cd /opt/harbor
docker-compose ps ##查看服务
docker-compose stop ##关闭
docker-compose up -d ##启动
7.访问web界面

8.拉取公共镜像
docker pull tomcat
docker tag tomcat harbor.yuankeedu.com/CloudPLayer/tomcat:latest
9.把tomcat镜像推送到harbor
# docker login https://harbor.yuankeedu.com
输入用户名和密码
# docker push harbor.yuankeedu.com/CloudPLayer/tomcat:latest
问题: x509: certificate signed by unknown authority
需要在客户端机器上(也就是你执行docker login的机器上.执行
1. echo -n | openssl s_client -showcerts -connect harbor.yuankeedu.com:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> /etc/ssl/certs/ca-bundle.trust.crt
2.systemctl restart docker