目录
远程访问docker -H 10.100.100.122:2375 image ls
1.0 docker基础
下载准备,镜像加速配置
docker-ce 配置文件默认在/etc/docker/daemon.json
{
“registry-mirros”:[“https://registry.docker-cn.com”]
}
下载安装docker
yum remove docker #删除旧版本docker
yum install -y yum-utils device-mapper-persistent-data lvm2 #安装aliyunDockerYum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装aliyunDockerYum源
yum install docker-ce -y #下载docker
systemctl start docker #启动
# yum erase docker-common-2:1.13.1-161.git64e9980.el7_8.x86_64 解决报错
Transaction check error:
file /usr/bin/docker from install of docker-ce-cli-1:19.03.9-3.el7.x86_64 conflicts with file from package docker-common-2:1.13.1-161.git64e9980.el7_8.x86_64
查询docker-hup上的镜像
[root@localhost ~]# docker search centos #starts为下载人数,official是否为官方镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6014 [OK]
ansible/centos7-ansible Ansible on Centos7 129 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 115 [OK]
jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 114 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 76
下载centos镜像docker pull centos
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
运行镜像中的bash/echo
[root@localhost ~]# docker run centos /bin/echo "hello world"
hello world
查看所有镜像
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d22dd02d81c centos "/bin/echo 'hello wo…" 3 minutes ago Exited (0) 3 minutes ago stupefied_feistel
指定名称运行centos镜像,进入容器中
[root@localhost ~]# docker run --name mydocker -dit centos /bin/bash #+d参数,容器在后台运行,不会因为空闲而退出
[root@7cfcde11b707 /]#
指定主机名创建容器:
[root@localhost ~]# docker run --name -it --nwework bridge -h [hostname] mydocker centos
#--nwework bridge 指定创建容器的网络类型
[root@localhost ~]# docker run --name -it --nwework bridge -h [hostname] --dns 114.114.114.114 --dns-search ilinux.io --add-host www.baodu.com:1.1.1.1 mydocker centos
#--dns 指定dns记录
#--dns-search 指定nds搜索域
#--add-host 添加容器host解析记录 host:ip
进入容器的方法:
1、exec命令
[root@localhost ~]# docker exec -it d16c7316b408 /bin/bash #进入正在运行的容器
[root@localhost ~]# docker exec -it d16c7316b408 /bin/sh
[root@localhost ~]# docker exec -it d16c7316b408 bash
[root@localhost ~]# docker exec -it d16c7316b408 sh
2、nsenter命令
获取容器的pid
[root@localhost ~]# docker inspect --format "{{.State.Pid}}" mydocker #前面命令不便,后接容器名称
6311
执行命令进入容器
[root@localhost ~]# nsenter --target 6311 --mount --uts --ipc --net --pid
基于容器做镜像,给镜像打tag
[root@localhost ~]# docker commit -p mynginx #-p 解决容器正在运行时做出的镜像文件不完整
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 8c516ab6fb55 15 seconds ago 127MB <--------新生成的镜像
nginx latest 9beeba249f3e 12 days ago 127MB
[root@localhost ~]# docker tag 8c516ab6fb55 tmz/web_nginx:v0.1-1 #docker tag给镜像打标签
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tmz/web_nginx v0.1-1 8c516ab6fb55 3 minutes ago 127MB
再次给tmz/web_nginx 创建一个新的标签
[root@localhost ~]# docker tag tmz/web_nginx:v0.1-1 tmz/web_nginx:v0.1-1.1 #一个镜像可以有多个标签,但一个标签只能用于一个镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tmz/web_nginx v0.1-1 8c516ab6fb55 4 minutes ago 127MB #除了tag其他信息没有变化
tmz/web_nginx v0.1-1.1 8c516ab6fb55 4 minutes ago 127MB
[root@localhost ~]# docker image rm tmz/web_nginx:v0.1-1.1 #删除标签时并不会删除镜像
Untagged: tmz/web_nginx:v0.1-1.1
查看镜像默认运行命令
[root@localhost ~]# docker inspect nginx
提交镜像时指定作者和运行的命令
[root@localhost ~]# docker commit -a "tmz <test@qq.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 tmz/http:v0.1
提交的作者 镜像默认运行的命令
推送镜像到docker hup
[root@localhost ~]# docker login -u dktest #首先登陆dockerhup的账号
[root@localhost ~]# docker push tmz/httpd #在推送镜像,把tmz/httpd仓库下的所用tag镜像推送值dockerhup
打包镜像
[root@localhost ~]# docker save -o myimages.gz tmz/web_nginx:v0.1-1 #默认打包在执行命令目录下,可共享给其他主机。
[root@localhost ~]# docker load -i myimages.gz #通过load命令可以直接加载镜像到docker服务镜像仓库
查看容器信息
[root@localhost ~]# docker inspect contarnername
查看容器服务的日志
[root@localhost ~]# docker logs b1
172.17.0.1 - - [29/May/2020:06:01:08 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
1.1docker网络访问
启动一个容器并随机映射端口
[root@localhost ~]# docker run --name nginx1 -it -p 80 nginx:1.14-alpine #把容器nginx1 80端口映射到宿主机
[root@localhost ~]# docker port nginx1 #查看容器的端口映射详细
80/tcp -> 0.0.0.0:1025
指定映射端口
[root@localhost ~]# docker run --name nginx2 -it -p 10.100.100.122::80 nginx:1.14-alpine #指定容器映射ip,冒号中间为空格则为动态,可指定端口。
#-P 暴露所有端口
查看docker网络信息
[root@localhost ~]# yum install bridge-utils #下载命令包
[root@localhost ~]# brctl show #查看宿主机网卡挂载信息
[root@localhost ~]# docker network inspect bridge #查看docker网络类型详细信息
docker三种网络类型
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
cde6abd95817 bridge bridge local #默认使用bridge,
4a1a07559444 host host local #使用宿主机的网络创建容器
a5a4affd097b none null local #不给容器分配虚拟网卡,只有lo网卡
改变docker0桥的ip段
/etc/docker/daemon.json
{
“bip”: “192.168.1.1/24”
}
打开远程访问docker
/etc/docker/daemon.json
{
“hosts”: [“tcp://0.0.0.0:2375”, “unix:///var/run/docker.sock”]
}
远程访问docker -H 10.100.100.122:2375 image ls
创建docker network网络
[root@localhost ~]# docker network create -d bridge --subnet “172.26.0.0/16” --gateway “172.26.0.1” mybr0
[root@localhost ~]# docker network ls #查看桥
[root@localhost ~]# ip link set dev veth4fe1ba6 name docker1 #修改设备名称,需要先down设备。
[root@localhost ~]# docker run --name ti -it --net mybr0 nginx:1.14-alpine #指定网卡创建容器,不指定默认使用docker0
打开ip转发
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1
1.2容器共享名称空间
网络共享
[root@localhost ~]# docker run --name b2 --network container:b1 -it nginx:1.14-alpine /bin/sh
#创建新容器b2,并且与b1共享网络名称空间。即b2和b1的虚拟ip相同,
[root@localhost ~]# docker inspect -f {{.NetworkSettings.IPAddress}} b1 #查看容器IP地址
卷共享
随机挂在
[root@localhost ~]# docker run --name dir1 -it -v /data nginx:1.14-alpine #-v指定挂在路径 /data为容器内路径,宿主机上随机生成挂在路径
[root@localhost ~]# docekr inspect dir1 #查看镜像详细信息,
#source为宿主机上随机生成的路径
"Mounts": [
{
"Type": "volume",
"Name": "41125cbbd0e0da2d6721a0467a5202c028f57ee4d0609f66686a830b43669ade",
"Source": "/var/lib/docker/volumes/41125cbbd0e0da2d6721a0467a5202c028f57ee4d0609f66686a830b43669ade/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
[root@localhost ~]# docker inspect -f {{.Mounts}} b1 #过滤查看挂载信息
#宿主机创建文件
[root@localhost ~]# cd /var/lib/docker/volumes/41125cbbd0e0da2d6721a0467a5202c028f57ee4d0609f66686a830b43669ade/_data
[root@localhost _data]# echo "hello container" >>test.html
#容器中查看
/ # ls /data
test.html
指定宿主机目录挂在
[root@localhost ~]# docker run --name dir1 -it -v /data/web:/data nginx:1.14-alpine #指定宿主机目录,不存在会自动创建
[root@localhost ~]# docker run --name dir2 -it --volumes-from dir1 nginx:1.14-alpine #复制使用其他容器的逻辑存储卷
2.0Dockerfile
dockerfile的指令:
FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。
RUN: 用来执行命令行命令。其基本格式:
shell格式: RUN <命令> ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式;
exec格式: RUN <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式;
COPY: 复制文件。 其基本格式:
格式1:COPY <源路径>...<目标路径>
格式2:COPY [“<源路径1>”,....."<目标路径>"]
ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;
CMD:容器启动命令。其基本格式:
shell格式: CMD <命令>
exec格式: CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数
ENTRYPOINT: 入口点。其基本格式分为exec和shell,
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过docker run 的参数--entrypoint 来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了: <ENTRYPOINT> "<CMD>"
ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式:
格式1:ENV <key> <value>
格式2:ENV <key1>=<value1> <key2>=<value>...
ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:
格式1: ARG <参数名> [=<默认值>]
格式2: 该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖
VOLUME: 定义匿名卷。 其基本格式:
格式1: VOLUME ["<路径1>", "<路径2>"...]
格式2: VOLUME <路径>
EXPOSE: 暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:
格式1: EXPOSE <端口1> [<端口2>...]
WORKDIR: 指定工作目录。其基本格式:
格式1: WORKDIR <工作目录路径>
USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式:
格式1: USER <用户名>
HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式:
格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令
ONBUILD : 在Dockfile中定义一个触发器,当镜像被引用时即触发
格式1:ONBUILD <INSTRUCTION>
例如: ONBUILD ADD wget http://nginx.org/download/nginx-1.15.2.tar.gz /tmp
范例
FROM centos:7
LABEL maintainer test.sc
RUN useradd www -u 1200 -M -s /sbin/nologin \
mkdir -p /var/log/nginx
RUN yum install -y cmake pcre pcre-devel openssl openssl-devel gd-devel \
zlib-devel gcc gcc-c++ net-tools iproute telnet wget curl &&\
yum clean all && \
rm -rf /var/cache/yum/*
RUN wget http://nginx.org/download/nginx-1.15.2.tar.gz
RUN tar zxf nginx-1.15.2.tar.gz
WORKDIR nginx-1.15.2
RUN ./configure --prefix=/usr/local/nginx --with-http_image_filter_module --user=www --group=www \
--with-http_ssl_module --with-http_v2_module --with-http_stub_status_module \
--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid
RUN make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "leilei hello" >/usr/local/nginx/html/index.html && \
rm -rf nginx* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
RUN chown -R www.www /var/log/nginx
ENV LOG_DIR /var/log/nginx
ENV PATH $PATH:/usr/local/nginx/sbin
EXPOSE 80
WORKDIR /usr/local/nginx
CMD ["nginx","-g","daemon off;"]
Docker build
[root@localhost images]# docker build -t runoob/ubuntu:v1 ./ #-t为镜像打标签 , 使用当前目录下的Dockfile创建镜像
3.0Docker私有registry
Docker Registry分类
- Registry 用于保存docker镜像,包括镜像的层次结构和元数据
- 用户可自建Registry,也可使用官方的DockerHub
- 分类
- Sponsor Registry: 第三方的registry,供客户和Docker社区使用
- Mirror Registry : 第三方的registry,只让客户使用。
- Vendor Registry : 由发布Docker镜像的供应商提供的registry
- Private Registry : 通过设有防火墙和额外的安全层的私有实体提供的registry
安装私有docker-redistry
[root@localhost images]# yum install docker-registry #下载私有仓库软件包
[root@localhost images]# rpm -ql docker-distribution #docker-distribution 为最终服务名
/etc/docker-distribution/registry/config.yml #配置文件地址
/usr/bin/registry #软件命令地址
/usr/lib/systemd/system/docker-distribution.service #服务启动命令
/usr/share/doc/docker-distribution-2.6.2
/usr/share/doc/docker-distribution-2.6.2/AUTHORS
/usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md
/usr/share/doc/docker-distribution-2.6.2/LICENSE
/usr/share/doc/docker-distribution-2.6.2/MAINTAINERS
/usr/share/doc/docker-distribution-2.6.2/README.md
/var/lib/registry #镜像存储地址
[root@localhost images]# cat /etc/docker-distribution/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
layerinfo: inmemory
filesystem:
rootdirectory: /var/lib/registry #在此修改镜像存储地址
http:
addr: :5000 #默认启动端口
启动服务
[root@localhost images]# systemctl start docker-distribution
[root@localhost images]# netstat -lntup | grep registry
tcp6 0 0 :::5000 :::* LISTEN 3415/registry
推送服镜像
[root@localhost node1]# docker tag myweb:v0.1-1 test.registry.com:5000/myweb:v0.1-1 #给镜像打包
[root@localhost node1]# docker push test.registry.com:5000/myweb:v0.1-1 #推送指定仓库下的镜像
[root@localhost node2]# docker pull test.registry.com:5000/myweb:v0.1-1 #拉取私有仓库镜像
非https链接仓库地址配置
vim /etc/docker/daemon.json
{
“insecure-registries”: [“test.registry.cn:5000”],
}
VMware harbor 安装
https://github.com/goharbor/harbor/releases 仓库地址
下载对应安装包,编辑harbor.cfg文件修改对应信息
hostname
安装docker-compose
yum install docker-compose -y
执行harbor下install.sh脚本
4.0Docker 资源限制
-m 5G 指定内存大小
--cpus 2 指定核心数
--cpuset-cpus 0,2 指定核心位置
--oom-kill-disable=ture 禁止oomkill掉容器
官方手册(完整的可用参数列表):
https://docs.docker.com/engine/reference/commandline/dockerd/#run-multiple-daemons
{
"authorization-plugins": [],2018/8/23
"data-root": "",
"dns": [],
"dns-opts": [],
"dns-search": [],
"exec-opts": [],
"exec-root": "",
"experimental": false,
"storage-driver": "",
"storage-opts": [],
"labels": [],
"live-restore": true,
"log-driver": "",
"log-opts": {},
"mtu": 0,
"pidfile": "",
"cluster-store": "",
"cluster-store-opts": {},
"cluster-advertise": "",
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"default-shm-size": "64M",
"shutdown-timeout": 15,
"debug": true,
"hosts": [],
"log-level": "",
"tls": true,
"tlsverify": true,
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"swarm-default-advertise-addr": "",
"api-cors-header": "",
"selinux-enabled": false,
"userns-remap": "",
"group": "",
"cgroup-parent": "",
"default-ulimits": {},
"init": false,
"init-path": "/usr/libexec/docker-init",
"ipv6": false,
"iptables": false,
"ip-forward": false,
"ip-masq": false,
"userland-proxy": false,
"userland-proxy-path": "/usr/libexec/docker-proxy",
"ip": "0.0.0.0",
"bridge": "",
"bip": "",
"fixed-cidr": "",
"fixed-cidr-v6": "",
"default-gateway": "",
"default-gateway-v6": "",
"icc": false,
"raw-logs": false,
"allow-nondistributable-artifacts": [],
"registry-mirrors": [],
"seccomp-profile": "",
"insecure-registries": [],
"disable-legacy-registry": false,
"no-new-privileges": false,
"default-runtime": "runc",
"oom-score-adjust": -500,
"runtimes": {
"runc": {
"path": "runc"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"--debug"
]
}
}
}