Docker从0到1

安装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、rpm

apt-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服务
  1. 创建apache的镜像
  2. 启动容器的时候直接启动apache服务
  3. 修改默认首页 hello nsd1905
  4. 设置永久工作目录 /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.自定义镜像仓库

  1. 创建一个镜像仓库
  2. 给镜像仓库上传镜像
  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

你可能感兴趣的:(Docker,docker,容器,运维)