Docker实用指令和搭SSH服务的实战

简介: Docker实用指令和搭SSH服务的实战

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

 


目录
相关文章
|
4月前
|
Linux 网络安全 Docker
盘古栈云,创建带ssh服务的linux容器
创建带ssh服务的linux容器
366 146
|
4月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
8月前
|
运维 监控 数据可视化
容器化部署革命:Docker实战指南
容器化部署革命:Docker实战指南
|
5月前
|
Ubuntu 网络安全 数据安全/隐私保护
搭建SSH服务于RK3399平台上的Ubuntu 18.04,实现远程连接
以上步骤涵盖从安 装 到配制再至实际使 用户建立Ssh 连接所需知识点 。务必注意,在对外提供Ssh 访问
253 2
|
7月前
|
供应链 测试技术 开发者
用 Docker 轻松部署 ERPNext 15:多场景实战指南
ERPNext 15 是一款功能全面的开源企业资源规划系统,结合 Docker 容器化部署,具备高效、灵活、低成本等优势。适用于小微企业数字化起步、多分支机构协同办公、开发者测试环境搭建、短期项目管理及企业内部培训等多种场景。模块化设计支持按需扩展,满足不同规模企业需求,是实现高效企业管理的理想选择。
用 Docker 轻松部署 ERPNext 15:多场景实战指南
|
8月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
432 14
|
8月前
|
安全 Java Docker
Docker 部署 Java 应用实战指南与长尾优化方案
本文详细介绍了Docker容器化部署Java应用的最佳实践。首先阐述了采用多阶段构建和精简JRE的镜像优化技术,可将镜像体积减少60%。其次讲解了资源配置、健康检查、启动优化等容器化关键配置,并演示了Spring Boot微服务的多模块构建与Docker Compose编排方案。最后深入探讨了Kubernetes生产部署、监控日志集成、灰度发布策略以及性能调优和安全加固措施,为Java应用的容器化部署提供了完整的解决方案指南。文章还包含大量可落地的代码示例,涵盖从基础到高级的生产环境实践。
483 3
|
10月前
|
Ubuntu Linux Docker
Docker容器的实战讲解
这只是Docker的冰山一角,但是我希望这个简单的例子能帮助你理解Docker的基本概念和使用方法。Docker是一个强大的工具,它可以帮助你更有效地开发、部署和运行应用。
241 27
|
9月前
|
关系型数据库 MySQL 数据库
Docker Compose-实战
Docker Compose-实战
293 5

热门文章

最新文章