安装docker
#卸载原docker
yum remove docker docker-common container-selinux docker-selinux docker-engine -y
#首先剩余未卸载的
rpm -qa|grep docker
docker-ce-cli-20.10.5-3.el7.x86_64
#执行卸载
yum -y remove docker-ce-cli-20.10.5-3.el7.x86_64
#安装前置条件
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加docker源方法一
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#添加docker源方法二
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker的ce版本
yum -y install docker-ce
#或者安装指定版本docker
yum install -y docker-ce-19.03.12 docker-ce-cli-19.03.12 containerd.io
#添加配置取镜像源
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#启动docker
systemctl start docker
#设置开机自启
systemctl enable docker
#查看docker版本
docker version
镜像相关命令
拉取镜像慢参考链接:https://blog.youkuaiyun.com/winter2121/article/details/107399812
yum -y install docker #安装docker
systemctl enable docker #设置开机自启
systemctl start docker #启动docker服务
docker search centos #搜索docker hub 上的centos镜像
docker pull centos:7.5.1804 #拉取指定版本镜像
docker pull nginx #拉取最新镜像
docker image ls #查看所有镜像
docker images centos:7.6.1810 #查看指定镜像
docker image inspect 镜像ID #查看镜像详细信息(后面加 IMAGE ID 信息)
docker image ls -q #只显示镜像ID
docker image ls --no-trunc #显示完整的镜像ID信息(sha256:64位号码,默认只截取12位)
docker image rm 镜像ID #删除镜像
docker image rm -f 镜像ID #加 -f 为强制删除
docker image rm -f $(docker image ls -q) #删除所有镜像
docker image save centos > /opt/centos.tar.gz #镜像导入
docker image load -i /opt/centos.tar.gz #镜像导出
docker tag [镜像id] [新镜像名称]:[新镜像标签] #重命名镜像
容器相关命令
docker run -it 镜像ID #交互式启动容器并进入
docker run -it --name='设置镜像唯一名称' 镜像ID #交互式启动容器指定名称并进入
docker run -it --restart=always --name='设置镜像唯一名称' 镜像ID #重启docker后自动拉起容器
docker run -it --name='设置镜像唯一名称' --rm 镜像ID #退出自动删除容器
docker run -itd --name c1 300e315adb2f #没有服务的容器需要加 -it
docker run -d --name n2 -h web_host -e test=123 -p 30:80 nginx #-h设置容器主机名 -e设置变量
#内容限制
#允许容器最多使用500m内存和100m的Swap --oom-kill-disable意思是资源不够用,不会去杀掉这个容器
docker run -d --name n3 --memory='500m' --memory-swap='100m' --oom-kill-disable nginx
#CPU限制
docker run -d --name n4 --cpus='1.5' nginx #允许容器使用一个半的cpu
docker run -d --name n5 --cpus='.5' nginx #允许容器使用半个cpu
docker stats --no-stream n3 #查看容器cpu内存使用率
docker ps #查看容器运行(只显示运行的)
docker ps -a #查看容器显示所有的
docker rm 容器ID #手动删除容器 如果要强制删除 rm -rf
docker rm $(docker ps -q -f status=exited) #删除已退出的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker run -d --name='zhang_ngix' nginx:1.14 #守护式容器启动命令
docker run -d -p 28:80 --name='nginx_80' nginx #把宿主机的28端口映射给nginx容器80端口)
docker run -d -p 192.168.1.208:29:80 --name='nginx_80' nginx #指定宿主机IP和端口映射给nginx容器80端口)
docker stop 容器ID #停止容器
docker start 容器ID #启动容器
docker attach 容器ID #进入已启动的容器
docker exec -it 容器ID bash #子进程方式登录(退出不会影响当前容器)
ctrl+P+Q #容器后台运行
docker ps -a -q #只显示容器ID
docker top 容器ID #显示容器进程ID等信息
docker inspect 容器ID #查看容器IP地址
docker logs 容器ID #查看日志
docker logs -f 容器ID #实时查看
docker logs -tf 容器ID #详细实时查看
Ctrl+D或者 exit #退出交互模式
容器服务重启后自启
方法1:配置后所有容器都生效
docker server配置文件 /etc/docker/daemon.json 添加
{
'''''''',
"live-restore":true
}
注意:第一行后面加逗号
方法2:添加运行容器的时候添加 --restart=always ,对单台起作用
docker run -it --restart=always --name='设置镜像唯一名称' 镜像ID
宿主机和容器之间数据共享(挂载目录)
docker cp index.html n1:/usr/share/nginx/html/ #手动拷贝宿主机里面文件到容器
docker cp n1:/usr/share/nginx/html/50x.html ./ #手动拷贝容器里面文件到宿主机
#Volume实现宿主机和容器数据共享 -v 宿主机目录路径:容器目录路径
docker run -d -p 8080:80 --name='n1' -v /opt/html:/usr/share/nginx/html nginx
#数据卷容器(先把需要挂载的目录共享给A容器,在由其他的容器来挂载这台A容器,实现多台容器快速挂载相同目录)
#多个目录挂载到A容器
docker run -d --name 'A_docker' -v /opt/Volume/a:/opt/a -v/opt/Volume/b:/opt/b nginx
#把A容器挂载到其他容器
docker run -d -p 8081:80 --volumes-from A_docker --name 'n8081' nginx
docker run -d -p 8082:80 --volumes-from A_docker --name 'n8082' nginx
制作镜像
#docker commit 改动的容器名 新的镜像名:tag版本标识
docker commit c8 zhang/centos_ssh:8.3
centos7添加ssh
yum install -y openssh-server
mkdir /var/run/sshd
echo 'UseDNS no' >> /etc/ssh/sshd_config
sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
echo 'root:123456' | chpasswd
/usr/bin/ssh-keygen -A
#执行上面命令后,重新制作镜像
docker run -d -p 8080:22 --name='c75ssh' 6ffa3d443e20 /usr/sbin/sshd -D #启动镜像和sshd服务
dockerfile构建可sshd远程的镜像
创建一个路径dockerfile文件夹名称固定
dockerfile文件名固定
dockerfile文件里面的内容
#centos7.5添加ssh远程连接
#指定镜像,不加后面版本默认最新
FROM centos:7.5.1804
#运行脚本,RUN主要是黑屏终端可以运行的脚本
RUN yum install -y openssh-server \
&& mkdir /var/run/sshd \
&& echo 'UseDNS no' >> /etc/ssh/sshd_config \
&& sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd \
&& echo 'root:123456' | chpasswd
RUN /usr/bin/ssh-keygen -A
#容器暴露端口
EXPOSE 22
#启动容器时执行的命令可以添加在这里,注意要为双引号,启动时不用在添加
CMD ["/usr/sbin/sshd","-D"]
在ssh目录下运行dockerfile构建镜像
#zhang/c75为新构建的镜像名称,v1为tag -t #镜像名称 -f #指定dockerfile文件位置
docker image build -t 'zhang/c75:v1' ./
dockerfire命令解释
注意:要拷贝的文件或者执行的脚本都需要放到宿主机dockerfile目录
FROM centos:7.5.1804 #指定镜像,不加后面版本默认最新
MAINTAINER zhang #镜像维护者姓名
RUN mkdir /var/run/sshd && touch /opt/zhang.txt #后面跟运行的命令,命令之间用 && 间隔开
#COPY参数:把宿主机dockerfile目录里面文件拷贝到容器,可支持匹配,注意:拷贝目录,只拷贝目录下的子文件子目录
COPY index.html /var/www/html/
ADD bbs.tar.gz /var/wwww/html/ #和COPY功能一样,多了自动解压 .tar.* 功能 不是压缩包,就只拷贝,可指定url下载到容器上
ENV datadir /data/mysql/data #创建变量把路径值赋给datadir
VOLUME ["/var/www/html/","${datadir}"] #VOLUME暂时不明确/使用上面的变量
EXPOSE 22 #暴露容器端口
CMD ["/bin/bash","/init.sh"] #容器启动时运行的第一个脚本,脚本需放置dockerfile目录,注意:用双引号
ENTRYPOINT ["/bin/bash","/init.sh"] #启动容器第一个进程防止被手工输入的命令替换,防止容器启动就关闭
WORKDIR #类似于cd命令
列子:
init.sh脚本内容
docker构建私有的registry(用于内网)
1.启动registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry
2.修改配置文件:vim /etc/docker/daemon.json
添加一行数据[“自己宿主机的私有地址:端口”]
"insecure-registries":["192.168.0.54:5000"]
3.修改镜像名
#tag后面为镜像ID 镜像名规则:私有地址:端口/项目名/镜像名:版本号
docker tag 9f266d35e02c 192.168.0.54:5000/zhang/centos:7.4.1708
4.推镜像到registry
docker push 192.168.0.54:5000/zhang/centos:7.4.1708
给私有registry添加安全认证
1.生成密码
yum install httpd-tools -y
mkdir /opt/registry-auth/ -p
htpasswd -Bbn zhang 123 > /opt/registry-auth/htpasswd
2.重新启动带有秘钥的registry容器
docker run -d -p 5000:5000 -v /opt/registry-auth/:/auth/ -v /opt/registry:/var/lib/registry --restart=always --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
3.登录验证(初次推或者拉需要登录验证)
网络相关
docker network ls #查看网络类型
none #无网络模式
bridge #默认模式,相当于NAF
host #共用宿主机网络 Network NameSapce
container #与其他容器共用 Network NameSapce
docker run -it --name 'cb3' --network=bridge 300e315adb2f #启动指定网络模式
macvlan两台宿主机的容器之间实现内网访问(容器外网不可用,内网IP需要人为设定,容易内网冲突)
# 两台宿主机都需执行下面语句 --subnet:子网 --gateway:网关 -o:绑定到物理网卡 macvlan_1:网络名
docker network create --driver macvlan --subnet=100.0.0.0/24 --gateway=100.0.0.254 -o parent=eth0 macvlan_1
#A主机执行 设置成上面创建的网络 和 设置内网IP
docker run -it --network=macvlan_1 --ip 100.0.0.1 --name='c83' 300e315adb2f
#B主机执行 设置成上面创建的网络 和 设置内网IP
docker run -it --network=macvlan_1 --ip 100.0.0.2 --name='c83' 300e315adb2f
跨主机访问 overlay 实现容器之间访问 也可以连接外网
#启动 consul 服务,实现网络统一配置管理(只用执行一台宿主机)
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
#vim /etc/docker/daemon.json 添加配置后需要重启docker服务(宿主机都需添加配置)
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store":"consul://192.168.0.54:8500",
"cluster-advertise":"192.168.0.54:2376"
#创建overlay网络 oll:网络名可以随意取
docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 ol1
#启动指定网络
docker run -it --name 'cb3' --network=ol1 300e315adb2f #启动指定网络模式
容器运行就退出问题排查
Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令,就是会自动退出的
设置一个启动命令才就可以避免此问题,设置启动命令(一定要设置不会自动退出的命令)
启动命令1
后面加:ping www.baidu.com
docker run -d zhang:v1 ping www.baidu.com
启动命令2
后面加: /bin/sh -c “while true;do echo hello;sleep 5;done”
docker run -d zhang:v1 /bin/sh -c "while true;do echo hello;sleep 5;done"
dockerfile文件CMD后面加这个会让容器运行不退出
CMD ["/bin/sh","-c","while true;do echo hello;sleep 5;done"]