Docker架构图
DockerFile常用指令
CMD 与 ENTRYPOINT 的区别
ENTRYPOINT 的目的和 CMD 一样,都是指定容器的启动程序及参数。
ENTRYPOINT 在运行时也可以通过 docker run 的参数 --entrypoint 来替代镜像中默认的ENTRYPOINT,通过 --entrypoint 传的必须是可执行的二进制程序, 即不会以sh -c 形式执行。
当指定了 ENTRYPOINT (exec格式)后,CMD 的含义就发生了改变,不再是直接运行的命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:<ENTRYPOINT> "<CMD>"
http://cloud.51cto.com/art/201411/457338.htm
ADD和COPY 的区别
COPY <源路径>... <目标路径>
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL
镜像中存在和当前需要拷贝或添加的文件夹同名的文件夹时,才能够拷贝或添加成功。
COPY指令不会做自动解压工作
原路径现在实测必须是DockFile目录下的相对路径
WORKDIR指令
用于指定容器的一个目录,容器启动时执行的命令会在该目录下执行,相当于设置了容器的工作目录
https://blog.csdn.net/yjk13703623757/article/details/79648381
ONBUILD指令
可以为镜像添加触发器。其参数是任意一个Dockerfile 指令。
该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。
需要注意的是ONBUILD只能再构建子镜像中执行,对孙子镜像构建无效。
利用ONBUILD指令,实际上就是相当于创建一个模板镜像,需要在子镜像构建过程中执行的一些通用操作就可以在模板镜像对应的dockerfile文件中用ONBUILD指令指定。 从而减少dockerfile文件的重复内容编写。
VOLUME
使用 -v 来挂载一个主机上的目录到容器的目录
docker run -d -P --name web2 -v /src/webapp:/webapp training/webapp python app.py
容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标
Docker实用命令
重启docker服务
sudo service docker restart
查看docker的详细信息
docker info
查看镜像
docker images
搜寻镜像
docker search mysql
docker search tomcat
删除镜像
docker rmi imageid
给镜像重命名(之后要docker rmi repository:tag 删除imageid相同的另镜像)
docker tag imageid repository:tag
基于Dockerfile构建镜像
docker build -t 镜像的tag .
docker build -f /path/to/a/Dockerfile .
ps:
小数点.其实就是将当前目录设置为上下文路径。
-f Dockerfile文件的位置
存出镜像到本地文件
docker save -o ubuntu_14.01.tar ubuntu:14.04
从本地文件载入镜像
docker load --input ubuntu_14.01.tar
拉取镜像
docker pull ubuntu:16.04
docker pull tcbenkhard/centos6-jdk7 #Docker Hub 仓库下载一个Centos6并且安装了jdk7的镜像
docker pull dl.dockerpool.com:5000 ubuntu:16.04 #通过具体地址下载
docker pull docker.io/tomcat
创建容器
docker create -it ubuntu:16.04
启动容器
docker start containId
创建并启动容器
-d: 在后端启动docker
-P:随机映射49000~49900到容器内部
-p:固定映射某个端口到容器内部
-t:进入终端
-i:获得一个交互式的连接,通过获取container的输入
-rm:容器一退出就删除
docker run -it docker.io/tcbenkhard/centos6-jdk7 /bin/bash
docker run -ti ubuntu:16.04 /bin/bash
联网启动
docker run -ti -p --expose 95 --name centos6 docker.io/tcbenkhard/centos6-jdk7 /bin/bash
docker run -ti -p 127.0.0.1:5000:5000 --name centos6 docker.io/tcbenkhard/centos6-jdk7 /bin/bash #映射指定地址的指定端口
查看本机所有容器
docker ps -a
进入容器
docker exec -ti containId /bin/bash
docker attach containId
获取 容器的所有日志
docker logs containId
查看容器的详细信息
docker inspect containId
使用镜像源创建一个指定镜像的标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
终止容器
docker stop containId
删除容器
docker rm -f containId
退出容器
Ctrl-D或者exit
封装镜像
docker commit containId sshd:v1
docker commit -m "this is a new iamges" -a "lzhcoder"
查看docker容器启动日志
dcoker logs containId
查看构建历史
docker history imageid
停止并且删除所有容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
根据镜像名或id称删除容器
docker rm $(docker ps -a | awk '/imageid/ {print $1}')
想要删除untagged images,也就是那些id为<None>的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
1.创建一个私有仓库
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry:2
-v 指定镜像上传目录为容器的/opt/data/registry 默认在容器的/tmp/registry
2.对已有镜像重新打tag
docker tag docker.io/ubuntu:16.04 192.168.199.4:5000/test:16.04
images[:tag] [registryhost][username/]name[:tag]
3上传镜像
搭建ssh服务的实战
一、centos6
1.centos6安装sshd
sshd
rpm -qa|grep -E "openssh"
yum install openssh*
https://blog.csdn.net/mengyoufengyu/article/details/72855524
遇到的问题:
1.1.File"/usr/bin/yum", line 29, in <module> File"/usr/share/yum-cli/yummain.py", line 276, in
就执行下面语句后再安装
cd /var/lib/rpm/
rm -i __db.*
rpm –rebuilddb
yum clean all
https://blog.csdn.net/a756041482/article/details/48215609
2启动sshd
sudo systemctl enable sshd sudo systemctl start sshd 或者 service sshd start
查看绑定端口
netstat -aunpt
显示用户所有终端下的进程
ps aux
遇到的问题
2.1Could not load host key: /etc/ssh/ssh_host_dsa_key
安装sshd之后执行
ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_dsa_key
3封装为镜像,并且运行
docker commit containId sshd:v1
docker run -p 127.0.0.1:8089:22 -ti sshd:v1
4启动sshd
/usr/sbin/sshd -D &
二、ubunto
1基于docker commit命令创建
1.1.apt-get update
1.2.安装python3
apt-get install python3
1.3.尝试使用sshd命令,会发现容器中并没有安装此命令
sshd
1.4.尝试安装openssh-server
apt-get install -y openssh-server
1.5.要正常启动ssh服务,需要目录/var/run/sshd存在,手动创建他,并启动服务
mkdir -p /var/run/sshd
/usr/sbin/sshd -D &
1.6.此时查看容器的22端口(SSH服务默认监听的端口),已经处于监听状态
apt-get install net-tools
netstat -tunlp
1.7.修改SSH服务的安全登录配置,取消pam登陆限制
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
1.8.在root用户目录下创建.ssh目录,并复制需要登录的公钥信息
ssh-keygen -t rsa(客户端和服务端都执行一次)
cd root/.ssh
ls
显示id_rsa id_rsa.pub
把客户端的id_rsa.pub内容复制到服务端的id_rsa.pub
apt-get install vim
vi /root/.ssh/authorized_keys
1.9.创建自动启动SSH服务的可执行文件run.sh,并添加可执行权限:
vim /run.sh
chmod +x run.sh
run.sh的内容如下:
#!/bin/bash /usr/sbin/sshd -D &
1.10.保存镜像
sudo docker commit containId sshd:ubuntu
1.11.使用镜像,并添加端口映射(10022–>22),其中10022是宿主主机的端口,22是容器SSH服务监听端口
sudo docker run -it -d -p 10022:22 sshd/ubuntu:16.04 /run.sh
1.12.在客户端机通过ssh连接服务机10022端口:
ssh 192.168.199.4 -p 10022
或则
docker inspect containId
获取IPAddress
ssh IPAddress
2、使用Dockerfile创建
2.1.创建工作目录
mkdir -p sshd_ubuntu
2.2在其中创建Dockerfile和run.sh文件:
cd sshd_ubuntu/ && touch Dockerfile run.sh
2.3编写run.sh脚本和authorized_keys文件
vim run.sh cat run.sh
文件内容如下: #!/bin/bash /usr/sbin/sshd -D & cat /root/.ssh/id_rsa.pub > ./authorized_keys
2.3.编写Dockerfile
# cat Dockerfile
# 基础镜像信息
FROM ubuntu:14.04
# 维护者信息
MAINTAINER staryjie staryjie@163.com
# 更新apt缓存、安装ssh服务
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd /root/.ssh
RUN sed -ri 's#session required pam_loginuid.so#session required pam_loginuid.so#g' /etc/pam.d/sshd
# 配置免密要和自启动脚本
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
# 暴露22端口
EXPOSE 22
# 设置脚本自启动
CMD ["/run.sh"]
2.4创建镜像
cd ~/sshd_ubuntu/ && docker build -t sshd:ubuntu2 .
2.5测试镜像,运行容器
docker run -it --name ssh_test -p 10122:22 sshd:ubuntu2 bash
参考文章
https://www.cnblogs.com/jsonhc/p/7767669.html
https://blog.csdn.net/qq626387/article/details/50506636