安装docker
yum install -y docker
1.基本命令
镜像相关命令
查看镜像
docker images
result:
# 镜像的名字+标签=唯一
[root@zos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mariadb latest eff629089685 3 days ago 408 MB
docker.io/busybox latest d3cd072556c2 11 days ago 1.24 MB
搜索镜像
docker search img_name
下载镜像
docker pull img_name
导出、导入镜像(可用于镜像的备份与恢复)
导出(备份)镜像
docker save docker.io/mariadb:latest -o mariadb.tar
导入(恢复)镜像
docker load -i mariadb.tar
容器
启动一个容器
docker run -it docker.io/centos:latest /bin/bash
解读
/bin/bash
容器里的命令,若不填写,则执行容器默认的命令,也有的容器不写命令启动不起来,比如nginx
启动nginx
docker run -it docker.io/nginx:latest /bin/bash
那么启动容器的时候到底写不写默认命令呢?
Docker命名空间
docker通过6个命名空间将容器隔离出一个空间来uts:主机名命名空间
net:网络命名空间
pid:进程命名空间
user:用户命名空间
ipc:信号向量
mount:文件系统
Docker与虚拟机的区别
虚拟机执行的命令在真机真机无法查看Docker容器中执行的命令在真机可以查看并可以杀死
查看容器信息
docker ps
Docker基本命令
- 镜像常用命令
- docker images
- 查看镜像列表
- docker history
- 查看镜像制作历史,制作过程(dockerfile)
-
docker history docker.io/centos:latest --no-trunc=true
- docker inspect
- 查看详细信息,了解镜像环境、存储卷、标签等信息
- docker search
- 搜索镜像,获取镜像名,根据镜像名下载镜像
- docker pull
- 下载镜像
- docke push
- 上传镜像
- docker rmi
- 必须使用唯一值进行删除
- 删除本地镜像
- 先删除容器在删除镜像
- docker save|load
- 导入、导出镜像格式为tar包
docker save docker.io/mariadb:latest -o mariadb.tar docker load -i mariadb.tar
- docker tag
- 修改镜像名称和标签
- 理解为创建了一个软连接
docker tag old_name:v new_name:v
- 容器常用命令
- docker run
- 创建一个新的容器并运行容器
docker run -it docker.io/centos:latest
- 参数
- -i:交互式的
- -t:终端
- -d:在后台
docker run -itd docker.io/nginx:latest
- docker ps
- 查看容器列表
docker ps -a
- 参数
- -a:列出所有启动过的容器
- -q:只显示id
- docker stop|start|restart
- 关闭,启动,重启容器,后跟容器id
- docker attach|exec
- 进入容器
docker exec -it container_id /bin/bash # 创建一个新的终端并连接 # 连接原有的终端,若使用此方式进来了,可使用Ctrl+P Q退出终端,而不要用exit关闭终端,类似run命令中的-d参数,此命令经常用于查看原bash的输出内容 docker attach container_ids
- docker inspect
- 查看容器底层信息,
- docker top
- 查看容器进程列表,后跟容器id,等同于进入容器执行ps
- docker rm
- 删除容器,后跟容器id
- 正在运行的容器不能删除
- 组合命令
docker rm $(dockr stop id)
docker rm $(docker ps -aq)
补充
yum、rpmapt-get、dpkg
2.进阶命令
- docker commit:
- 后面跟容器id和自定义的镜像名,用于将容器保存为镜像文件
- dockerfile
- FROM:基础镜像
- MAINTAINER:镜像创建者信息
- EXPOSE:开放的端口
- ENV:设置变量
- ADD:复制文件到镜像
- RUN:制作时执行的命令,可以有多个
- 创建镜像时执行的命令
- WORKDIR:定义容器默认工作目录
- cd 在远程命令中无效,可以把RUN理解成ssh,因此就需要一个直接连接到某个目录的命令
- CMD:容器启动时执行的命令,仅可以有一条CMD
- 启动镜像时执行的命令
CMD ["/bin/ls","-l","-a"]
Dockerfile文件内容
FROM docker.io/centos:latest
ADD local.repo /root/local.repo
RUN yum install -y vim net-tools psmisc iproute
执行构建命令(执行当前.目录下的Dockerfile文件,构建成镜像test:latest)
docker build -t test:latest .
做一个ssh的服务1.查找命令在哪个包
yum provides sshd
2.查看安装路径
# centos
[root@33f6e23759fc /]# rpm -ql openssh-server
...
/usr/lib/systemd/system/sshd.service
...
# ubuntu
root@b476edb48d9c:/# dpkg -L nginx
3.查看sshd.server文件中的ExecStart
[root@33f6e23759fc /]# cat /usr/lib/systemd/system/sshd.service
...
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
...
4.生成一个密钥
[root@33f6e23759fc /]# ssh-keygen -A
[root@33f6e23759fc /]# sshd-keygen
5.设置密码&启动服务
[root@33f6e23759fc /]# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@33f6e23759fc /]# /usr/sbin/sshd -D
写成dockerfile
FROM myos:latest # 基于myos:latest镜像
RUN yum install -y openssh-server initscripts passwd # 安装所需要的包
RUN ssh-keygen -A # 生成需要的sshd-key
RUN echo "a" |passwd --stdin root # 设置登录密码
ENV EnvironmentFile=/etc/sysconfig/sshd # 设置环境变量
EXPOSE 22 # 开放22端口
CMD ["/usr/sbin/sshd","-D"] # 启动默认执行的命令
创建一个http服务
- 创建apache的镜像
- 启动容器的时候直接启动apache服务
- 修改默认首页 hello nsd1905
- 设置永久工作目录 /var/www/html
FROM myos:latest
RUN yum install -y httpd
WORKDIR /var/www/html # cd的替代者
ENV EnvironmentFile=/etc/sysconfig/httpd
ENV PS1='[webserver@\h \W]\$ ' # 设置主机名格式
ADD index.html index.html
EXPOSE 80
EXPOSE 442
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
3.自定义镜像仓库
- 创建一个镜像仓库
- 给镜像仓库上传镜像
- 所有客户机配置使用新的镜像仓库,启动容器()
3.1. 创建一个镜像仓库
安装私有仓库
[root@zos cc]# yum install -y docker-distribution.x86_64
启动私有仓库,并设为开机自启动
[root@zos cc]# systemctl start docker-distribution.service
[root@zos cc]# systemctl enable docker-distribution.service
仓库配置文件及数据存储路径
/ect/docker-distribution/registry/config.yml
/var/lib/registry
访问
http://ip:5000/v2/_catalog
3.2. 给镜像仓库上传镜像
客户端配置,修改配置文件
vi /tec/dcoker/darmon.json
{
"insecure-registries":["仓库ip:5000"]
}
重启服务
docker stop id # 停止所有容器
systemctl restart docker
修改镜像标签
docker tag docker.io/busybox:latest 仓库ip:5000/busybox:latest
上传镜像
docker push xxx.xxx.xxx.xxx:5000/busybox:latest
3.3.所有客户据使用新的镜像仓库启动容器
修改配置文件
vi /etc/docker/daemon.json
{
"insecure-registries":["仓库id:5000"]
}
systemctl restart docker
启动一个容器
# 配置完私有仓库不需要拉取镜像,直接docker run即可,且运行完容器以后该镜像会自动保存到本地
docker run -it [仓库ip:5000/]busybox:latest
网址:
http://xx.xx.xx.xx:5000/v2/_catalog
只显示镜像名
网址:http://xx.xx.xx.xx:5000/v2/myos/tags/list
产看镜像具体版本列表
4.持久化存储
主机卷的 映射
- 将真实机目录挂载到容器中提供持久化存储
- 目录不存在就自动创建
- 目录存在就直接覆盖掉
docker run -itd -v /root/test:/var/www/html myos:httpd1
4.1.使用NSF共享存储的案例
- NFS服务器共享目录
yum install nfs-utils vim /etc/exports /div *(rw) systemctl start nfs
- Docker主机
- mount挂载共享
- 运行容器时,使用-v选项映射磁盘到容器中
1.服务器创建NFS共享存储目录,权限为rw
# nfs服务器
yum install -y nfs-utils # 安装nfs服务使用的包
vi /etc/exports # 编辑nfs配置文件
/var/webroot *(rw) # 设置共享目录
mkdir /var/webroot # 创建需要共享的目录
chmod 777 /var/webroot # 设置共享目录的权限
systemctl start nfs # 开启nfs服务
systemctl restart nfs # 重启nfs服务
systemctl enable nfs # 将nfs服务设为开机自启
2.客户端挂载共享,并将共享目录映射到容器中
# docker1和docker2
yum install -y nfs-utils
showmount -e nfs服务器ip # 查看server服务器可挂载的目录
mount -t nfs nfs服务器ip:/var/webroot /mnt # 将nfs挂载到本地
3.docker1启动nginx
docker run -itd -v /mnt:/usr/share/nginx/html docker.io/nginx:latest
docker inspect nginx容器id # 查看容器底层信息,包括ip
4.docker2启动apache
docker run -itd -v /mnt:/var/www/html myos:httpd
docker inspect apache容器id # 查看容器底层信息,包括ip
5.nginx和apache共享同一web目录
echo "hello world" > /mnt/index.html
# docker1
curl 容器ip
# docker2
curl 容器ip
5.docker网络架构
目前docker使用的时虚拟交换机:docker0,使用ifconfig可以看到,用于docker内部容器通讯使用- docker常用网络命令
- docker network ls
- docker network create
- docker network rm
5.1docker常用命令
查看网络
docker network ls
创建一个新的虚拟机
docker network create --subnet=10.10.10.0/24 docker1
创建容器时指定使用的网络
docker run --network=bridge|host|none... ...
docker run --network=docker1 -itd docker.io/myos
5.2创建网络案例
docker network create --subnet=10.10.10.0/24 docker1
docker run -it --network=docker1 myos:latest
docker inspect container1_id # 10.0.0.2
docker run -itd --network=docker1 myos:latest
docker inspect container2_id # 10.0.0.3
docker exec -it container2_id /bin/bash
container2_id # ping 10.10.10.2 # 可以通
6.docker端口映射
加参数 -p-p 宿主机端口:容器端口
docker run -itd -p 81:80 -v /mnt:/var/www/html myos:httpd1
docker run -itd -p 82:80 -v /mnt:/var/www/html docker.io/nginx
补充知识点
查找命令在哪个包
yum provides sshd
查看安装路径
[root@33f6e23759fc /]# rpm -ql openssh-server
...
/usr/lib/systemd/system/sshd.service
...
查看sshd.server文件中的ExecStart
[root@33f6e23759fc /]# cat /usr/lib/systemd/system/sshd.service
...
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
...
生成一个密钥
[root@33f6e23759fc /]# ssh-keygen -A
[root@33f6e23759fc /]# sshd-keygen
查看端口
[webserver@a4df12f8c6d7 html]# ss -ltun